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 rudpcf

    system("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


Anmelden zum Antworten