CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Kopiowanie plików

Kopiowanie plików

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: 33
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 8
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: 4725
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
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
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 3
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: 4725
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
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
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 3
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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 1 gość

cron