Hilfe beim Kopierprogramm!!
-
Hey leute ich brauche unbedingt eure Hilfe ich habe mit hilfe eines Programmierers ein Programm geschrieben, dass Dateien kopiert!
Nun weis ich aber nicht mehr was die einzelnen Zeilen bedeuten oder aussagen! Könnt ihr mir weiter helfen? Hier der Quellcode ://--------------------------------------------------------------------------- void __fastcall TForm1::ButtonKopierenClick(TObject *Sender) { AnsiString file = EditPfad->Text; // ein neuer AnsiString mit dem Namen file int i = file.LastDelimiter("\\"); // AnsiString file2 = file.SubString(i + 1, file.Length() - i); String dir = "", root = ""; // "c:" if (SelectDirectory("Wählen Sie einen neuen Pfad aus", WideString(root), dir)) { //widestring=Quellstring kann kopiert werden dir += "\\" + file2; //neuer Pfad plus den alten Dateinamen bool ok = CopyFile(file.c_str(), dir.c_str(), false); //Datei wird kopiert, vorhandene Datei mit false überschreiben ShowMessage("Kopiervorgang erfolgreich abgeschlossen !"); } else ShowMessage("Kopiervorgang nicht erfolgreich !"); } //---------------------------------------------------------------------------
ich hab schon mal angefangen zu kommentieren.
/Edit akari : Bitte beim nächsten Mal Code-Tags (sfds) verwenden
-
Hallo
// ein neuer AnsiString mit dem Namen file, dem gleich der Inhalt von EditPfad zugewiesen wird AnsiString file = EditPfad->Text; // Im Dateinamen mit Pfad wird nach dem letzten Backslash gesucht int i = file.LastDelimiter("\\"); // Aus dem Dateinamen mit Pfad wird der Teil extrahiert und in file2 kopiert, // der nach dem Backslash kommt. Sprich : In file2 steht nur noch der Dateiname, // ohne Pfad. Problem : Was passiert wenn gar kein Backslash in file war?! AnsiString file2 = file.SubString(i + 1, file.Length() - i); // Leere Strings werden angelegt String dir = "", root = ""; // Dem Benutzer wird ein Dialog angezeigt, wo er ein Verzeichnis auswählen soll. // Das Ergebnis wird in dir zurückgegeben. Nur wenn der Benutzer den Dialog // nicht abbricht, wird kopiert. if (SelectDirectory("Wählen Sie einen neuen Pfad aus", WideString(root), dir)) { // Der neue Pfad wird um Backslash und Dateiname ergänzt dir += "\\" + file2; // Datei wird von alt (file) nach neu (dir) kopiert (überschreiben), // die Rückgabe gibt an ob Erfolg oder nicht bool ok = CopyFile(file.c_str(), dir.c_str(), false); if (ok) ShowMessage("Kopiervorgang erfolgreich abgeschlossen !"); else ShowMessage("Kopiervorgang nicht erfolgreich !"); } else { ShowMessage("Kopiervorgang vom Benutzer abgebrochen !"); }
Ich habe mal die Einrückung verbessert.
Auch die ShowMessages fand ich unlogisch plaziert, vor allem da du "ok" zwar anlegst, desen Wert aber überhaupt nicht benutzt um den Erfolg zu prüfen.
Außerdem halte ich das Gemisch aus AnsiString, String und WideString für sinnfrei. Warum verwendest du nicht überall nur String?bis bald
akari
-
Hey super, dass hilft mir schon sehr viel weiter.
Aber wie würde das den aussehen, wenn man nur Strings benutzt?
-
Hallo
Na ersetzt alle "AnsiString" durch "String", und las das "WideString" in SelectDirectory weg. Wenn dein Builder richtig konfiguriert ist, wird er den korrekten String-Typ automatisch verwenden.
bis bald
akari
-
Hey danke für die schnelle Hilfe, hat einwandfrei funktioniert.
Tut mir leid, wenn ich jetzt noch fragen würde, wie der Kopiervorgang funktionieren würde, wenn ich einen ganzen Ordner kopieren möchte?
-
Hallo
Vermutlich nicht so einfach. Ich weiß nicht ob es eine WinAPI-Funktion für das Kopieren eines Verzeichnises samt Inhalt gibt, aber du könntest mit "system" ja ein xcopy-Befehl ausführen lassen.
Ansonsten eben nur manuell : Mit FindFirst/FindNext alle Dateien in dem Verzeichnis suchen und nacheinander mit CopyFile kopieren.bis bald
akari
-
Bin totaler Anfänger, wie sieht das den aus mit System und xcopy?
-
Hallo
system ist eine einfache Funktion, die einen beliebigen String als Kommandozeilen-Befehl ausführt.
xcopy ist ein Kommandozeilenbefehl. Wenn du mehr dazu wissen willst, ruf in einem Konsolenfenster mal "xcopy /?" auf, um die möglichen Parameter angezeigt zu bekommen, oder frag im rudpcfsystem("xcopy pfad1 pfad2");
bis bald
akari
-
Danke
-
system("xcopy file1 file2");
ist wirklich nicht schön.
nimm lieber CopyFile,
oder schreibe mit filestreams.Wenn du Variablenumwandlungsprobleme hast dabei, dann helfen wir gern.
Möglich, aber vielleicht noch zu schwer (ich würds dir erklären):
Ich könnte dir auch gern eine kleinen Header geben, mit der du ein ganzes Verzeichnist kopieren kannst.
-
Tim06TR schrieb:
mit der
Wusste nicht dass Header 'n mädl ist.
-
Zum Datei kopieren gibts auch was in der FAQ
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39283.html