Verzeichnisse kopieren



  • Hallo,

    ich möchte ein komplettes Verzeichnis kopieren. Ich weiss das man zunächst alle Ordner und Dateien herausfinden. Dies wurde mir bereits in einem Beitrag gesagt. Wie man Dateien kopiert ist auch klar. Nur wie geht man am besten vor, wenn ein Verzeichnis mehrere Unterverzeichnisse hat und die Unterverzeichnisse auch wieder Unterverzeichnisse haben.



  • Stichwort is Rekursion 😎



  • Danke! Rekursion war ein super Stichwort. Habs hinbekommen!



  • Leider ist das doch nicht so einfach wie ich gedacht habe!! Das mit dem kopieren klappt einwandfrei, die Methode ist fertig:
    Die Funktion wird folgendermaßen aufgerufen:

    copyfile ("C:\\quellordner\\","C:\\zielordner\\");
    

    Die Methode lautet:

    void __fastcall TForm1::copyfile (char *qpath,char *spath)
    {
    int erg=0;
    struct TSearchRec SR;
    char qpath2 [500];
    char spath2 [500];
    
    strcpy (qpath2,qpath);
    strcat (qpath2,"*.*");
    
    FindFirst(qpath2,faAnyFile,SR);
    
    strcpy (qpath2,qpath);
    strcpy (spath2,spath);
    
    while (erg==0)
    {
      strcpy (qpath2,qpath);
      strcat (qpath2,SR.Name.c_str());
    
      strcpy (spath2,spath);
      strcat (spath2,SR.Name.c_str());
      CopyFile (qpath2,spath2,true);
    
     if ((SR.Attr&faDirectory)>0&&SR.Name!="."&&SR.Name!="..")
     {
       CreateDir (spath2);
       strcat (spath2,"\\");
       strcat (qpath2,"\\");
    
       copyfile (qpath2,spath2);
     }
     erg=FindNext (SR);
    
     }
    }
    

    Aber wie kann ich den Kopiervorgang abbrechen. Ich wüsste nicht wie das mit nem Timer gehen sollte. Wäre dankbar um Antworten!



  • Wann willst DU denn abbrechen ?
    🙄
    Aufgrund einer Eingabe oder hört Deine Funktion nicht auf wenn alle
    Datein drüben sind ?



  • Hallo

    einfache Methode :
    - eine neue Bool Variable als Member des Forms mit Namen z.B. CopyStop erstellst, die den Standardwert false bekommt
    - deine Funktion um eine Abbruchbedingung erweiterst :

    while (erg==0)
    {
      Application->ProcessMessages();
      if (CopyStop == true) return;
      ...
    

    - in einem Button zum Abbrechen setzt du CopyStop auf true;
    Wenn du noch CopyFile() durch CopyFileEx() ersetzt, kannst du auch das Kopieren einer einzelnen Datei beenden, aber dazu mußt du andere Parameter übergeben und eine Callback-Funktion erstellen

    umfangreiche Methode :
    ein TThread-Objekt erstellen und steuern. Dazu findest du einiges im Forum.

    bis bald
    akari



  • Danke der Beitrag von akari hat mir weitergeholfen.
    @YLIREBUS: Ja ich meinte einen Abbrechen Button.


Anmelden zum Antworten