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

Kopiowanie plików

Nowy postNapisane: wtorek, 9 października 2018, 20:22
przez Manianass
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.

Re: Kopiowanie plików

Nowy postNapisane: środa, 10 października 2018, 09:21
przez Cyfrowy Baron
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.

Re: Kopiowanie plików

Nowy postNapisane: środa, 10 października 2018, 11:46
przez lukagrom
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");
 

Re: Kopiowanie plików

Nowy postNapisane: środa, 10 października 2018, 12:02
przez Cyfrowy Baron
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ę!" );

Re: Kopiowanie plików

Nowy postNapisane: środa, 10 października 2018, 12:19
przez lukagrom
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ą).

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

Nowy postNapisane: środa, 25 maja 2022, 21:39
przez polymorphism