CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Cong Ty C? Ph?n Thuong M?i D?u Tu Va Phat Tri?n Cong Ngh? Sc

Cong Ty C? Ph?n Thuong M?i D?u Tu Va Phat Tri?n Cong Ngh? Sc

dział ogólny

Kopiowanie plików

Nowy postprzez Manianass » wtorek, 9 października 2018, 20:22

Witam, mam zamiar skopiowac plik z podanego miejsca w Edit1 i skopiowac na PenDrive.
Pisze w C++Builder 10.2
kod z BCB 6 nie działa
Kod: Zaznacz cały
CopyFile("c:\\\\temp\\readme.txt", "c:\\\\Moje dokumenty\\readme.txt", true);

Zmieniłem na
Kod: Zaznacz cały
CopyFileA("c:\\\\temp\\readme.txt", "c:\\\\Moje dokumenty\\readme.txt", true);

i działa , tylko nie wiem jak zrobic zeby kopiowało plik z lokalizacji wpisanej do Edit1 a oto teks wklejany do edit "c:\Users\Do\Desktop\O8905.NC" i aby było trudniej to ścieszka do pliku czesto sie zmienia i nazwa pliku tez sie zmienia ale zawsze zajmuje 8 znaków i ma rozszerzenie .NC. i w miejscu docelowym nazwa ma byc taka sama jak nazwa pliku kopiowanego.

Dziekuje za pomoc.
Avatar użytkownika
Manianass
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Builder C++
Gadu Gadu: 0
    Windows 7Chrome

Re: Kopiowanie plików

Nowy postprzez Cyfrowy Baron » środa, 10 października 2018, 09:21

W nowych środowiskach stosuje się domyśle już UnicodeString a nie AnsiString. Pierwszy kod powinien działać o ile masz odpowiednio ustawione środowisko. Niestety nie wiem co trzeba przestawić w tej wersji środowiska. Co się zaś tyczy funkcji CopyFileA to wymusza ona stosowania AnsiString zamiast UnicodeString. Używanie AnsiString uniemożliwi ci kopiowanie plików zawierających w nazwie znaki unicode.

Tak czy owak funkcję CopyFile należy stosować w nowszych wersjach środowiska w ten sposób:

KOD cpp:     UKRYJ  
CopyFile( L"c:\\temp\\readme.txt", L"c:\\Moje dokumenty\\readme.txt", true ); /* podwójne ukośniki, nie poczwórne */


Funkcja oczekuje wartości typu wchar_t a nie char więc należy każdy łańcuch znaków poprzedzić znakiem L

Gdybyś chciał tam wstawić ścieżki z jakiejś zmiennej to robisz to tak:

KOD cpp:     UKRYJ  
String sPath = "c:\\temp\\readme.txt";
CopyFile( sPath.c_str(), L"c:\\Moje dokumenty\\readme.txt", true );


Gdybyś chciał mieszać zmienną z łańcuchem znaków to wtedy tak:

KOD cpp:     UKRYJ  
String sPath = "c:\\temp\\";
String sDoc = "c:\\Moje dokumenty\\";
String sFile = "readme.txt";
CopyFile(  (sPath + "readme.txt").c_str(), (sDoc + sFile).c_str(), true );


Skoro chcesz używać ścieżki dostępu z kontrolki TEdit to robisz to tak:

W Edit1 ścieżkę podajemy normalnie, czyli: c:\Users\Do\Desktop\O8905.NC bez podwójnych ukośników
KOD cpp:     UKRYJ  
String sDesPath = "d:\\pendrive\\" + ExtractFileName(Edit1->Text); /* ścieżka docelowa, z Edit1 ekstrahuję nazwę pliku */
CopyFile( Edit1->Text.c_str(), sDestPath.c_str(), true );


Ścieżkę docelową musisz podać, bo program się jej nie domyśli.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Kopiowanie plików

Nowy postprzez lukagrom » środa, 10 października 2018, 11:46

Ewentualnie tak (działa i kopiuje dla 10.1 Berlin)

KOD cpp:     UKRYJ  
 UnicodeString sKoniec="e:\\";    //moj pendrive
 UnicodeString sPoczatek="c:\\";
 if(!CopyFile((sPoczatek+(ExtractFileName(Edit1->Text))).w_str(),(sKoniec+(ExtractFileName(Edit1->Text))).w_str(),false))
  ShowMessage("Cos nie poszlo");
 
Avatar użytkownika
lukagrom
Bladawiec
Bladawiec
 
Posty: 44
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Kopiowanie plików

Nowy postprzez Cyfrowy Baron » środa, 10 października 2018, 12:02

To zależy jak jest ustawione środowisko. Twój kod lukagrom przy moich ustawieniach środowiska zwróciłby błąd. Wejdź w Ustawienia > Directories and Conditionals > opcja _TCHAR_maps to ustaw wchar_t a przekonasz się, że kod zwróci błąd. Przy mapowaniu na wchar_t a nie char kod musiałby wyglądać tak:

KOD cpp:     UKRYJ  
String sKoniec = L"e:\\";    //moj pendrive
String sPoczatek = L"c:\\";

if( !CopyFile( (sPoczatek + ( ExtractFileName( Edit1->Text ) ) ).c_str(), ( sKoniec + ( ExtractFileName( Edit1->Text ) ) ).c_str(), false) )  ShowMessage( "Kopiowanie nie powiodło się!" );
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Kopiowanie plików

Nowy postprzez lukagrom » środa, 10 października 2018, 12:19

Twój kod z .c_str i L u mnie chodzi spokojnie, więc zakładam, że to nosi cechy uniwersalności i jak najbardziej należy z tego korzystać. Z drugiej strony wszystkie kolejne wydania C++ Builder "prą" w funkcjach i zmiennych systemowych na parę - UnicodeString - wstr_t, nie oglądając się na to, że dla sporej liczby wywołań klas i funkcji, to nie zawsze działa (zwłaszcza char* i wchar_t, mocno kolidują).
Avatar użytkownika
lukagrom
Bladawiec
Bladawiec
 
Posty: 44
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome



Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron