Verzeichnisse kopieren [C++]

Hey Leute,
ich hoffe das man mir hier weiterhelfen kann!
ich muss für eine Bewerbung ein Programm schreiben. Ich hab das ganze versucht rekursiv zu lösen, allerdings kam da nur schwachsinn raus, und der Code sieht so verpfrimelt aus das ich den hier lieber nicht poste;(

Die Aufgabenstellung der Firma:
-Das Programm muss einen Ordner mit allen Dateien und Unterordnern von seinem Ursprungsort auf einen USB Stick (hier liegt die exe) kopieren können und von dort zu einem beliebigen Zeitpunkt an einen anderen Ort.

-Hierbei muss ein Fortschrittsbalken, eine Prozentanzeige oder ähnliches den momentanen Fortschritt grafisch darstellen können.

-Es muss sich um eine Win32 Executable (Ein unter Windows (32bit)) lauffähiges Programm handeln

-(optional) Die kopierten Daten sollen auf Vollständigkeit überprüft werden.
-(optional) Die kopierten Daten sollen auf Korrektheit überprüft werden.

Das grafische ist mir im Augenblick noch nicht so wichtig, wär aber trotzdem schön. Das wichtigste ist, wenn das Programm erst mal die Grundfunktion (kopieren von Verzeichnissen) drauf hätte.


Ich hoffe von euch kann mir jmd helfen, vielen vielen Dank im vorraus

PS: Das Programm muss in C++ geschrieben werden
 
Wir helfen gerne, nur wüssten wir auch gerne, wobei. Du schreibst nur, dass du Hilfe brauchst, aber nicht was bei deiner bisherigen Lösung nicht funktioniert. Und wenn du dich so sehr schämst für den Code solltest du eventuell daran arbeiten, dass man ihn her zeigen kann.
Eine fertige Lösung wird dir keiner liefern, aus Prinzip.

mfg benediktibk
 
ich habe zwar prinzipiell die lösung deines problems, und ich könnte dir das vermutlich in ein paar minuten auch in einen quellcode verwandeln, aber um dem einwand von benediktibk gerecht zu werden, und da du keine konkrete frage gestellt hast, bekommst du eine korrekte, aber für jemanden der eine fertige lösung erwartet vollkommen nutzlose antwort

unter folgender url findest du einen für dein problem relevanten teil der windows api dokumentiert...
http://msdn.microsoft.com/en-us/library/aa364229.aspx

besonderes interesse könntest du an den funktionen CopyFileEx, FindFirstFile, FindNextFile sowie GetFileAttributes haben ...

meine vorgehensweise wäre:

traversieren des quellbaumes um die gesammtgröße zu bestimmen, sowie alle quelldateien zu identifizieren

rekursion bietet sich an, da man für jedes sub dir quasi wieder das ausgangsproblem vorfindet

direkt beim durchlauf kann man die struktur auf das ziel abbilden, die gesammtgröße aus allen teilgrößen errechnen und die zu kopierenden dateien in eine warteschlange einreihen ...

bei der rekursion ist ggf. auf links zu achten, damit die rekursion mit sicherheit ein ende hat...

nach dem rekursions ende kann man die warteschlange abarbeiten ...

CopyFileEx berichtet dir an via callback den aktuellen fortschritt der gerade kopierten datei ... da du zudem die gesammtgröße kennst, kannst du auch deinen fortschritt für die aktuelle datei sowie den gesammten vorgang angeben ...

im anschluss kannst du die gleiche rekursion wie zu anfang nochmals durchführen und auf vollständigkeit prüfen (ggf erstelldatum mit einbeziehen, um verwirrungen durch neue dateien auszuschließen, etc)

zudem kannst du bei der gelegenheit eine prüfsumme álá crc32 für jede datei berechnen lassen und sie gegen ihr gegenstück testen


zu beachten wäre noch dass viele wege nach rom führen ... wie auch zur lösung dieses problems ... DIE EINE richtige lösung gibt es nicht ...


wenn man fragen darf ... als was hast du dich beworben, dass dir so eine aufgabe gestellt wird?
 
Also erstmal vielen Dank!
@GrafZahl: ich habe mich als Fachinformatiker für Anwendungsentwicklung beworben.

Ich werde den Quelltext im laufe des Tages noch posten, er kopiert ja die Dateien bis jetzt einigermaßen, nur kommt es vor das er einen Ordner in einen anderen kopiert wo dieser nix zu suchen hat, gleich verhält es sich mit den Dateien.
 
so hier isser :wall: :



Code:
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <dir.h>

void Verzeichnisse(char *, char*);

///////////////////////////////////////////////////////////////////////////////
int main()
{
 Verzeichnisse(".", "C:\\Dokumente und Einstellungen\\Selig\\Desktop");
 system("pause");
 return (0);
}
///////////////////////////////////////////////////////////////////////////////
void Verzeichnisse(char *akPfad, char *zielPf)
{
 WIN32_FIND_DATA FindFileData;
 HANDLE hFind = INVALID_HANDLE_VALUE;
 char AkDir[MAX_PATH];
 char nextDir[MAX_PATH];
 char cpyPfad[MAX_PATH];
 char zielPfad[MAX_PATH];
 char zielPfad2[MAX_PATH];
 char tmp[MAX_PATH];

 //Verzeichnis Pfad wird in AkDir (Aktuelles Verzeichnis) kopiert 
 strcpy(AkDir, akPfad);
 strncat (AkDir, "\\*", 3);
 //Zielverzeichnis
 strcpy(zielPfad, zielPf);
 strcpy(tmp, zielPf);
  
 hFind = FindFirstFile(AkDir, &FindFileData);
        //Solange noch Daten bzw Dateien vorhanden sind wir diese Schleife durchlaufen
  while (FindNextFile(hFind, &FindFileData) != 0) 
  {
               
                
   if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
    (!strcmp(FindFileData.cFileName, "..") == 0))
   {
                strcpy(tmp, zielPfad);
                strcat(zielPfad, "\\");
                strcat(zielPfad, FindFileData.cFileName);
                mkdir(zielPfad);
             
    printf("%s\\%s\n",akPfad, FindFileData.cFileName);
    strcpy(nextDir, akPfad);
    strcat(nextDir,"\\");
    strcat(nextDir,FindFileData.cFileName);
   
       
    Verzeichnisse(nextDir, zielPfad);  //rekursiver selbstaufruf
   }
   else
   {
                strcpy(cpyPfad, AkDir);
                strcpy(cpyPfad, FindFileData.cFileName);
                
                strcpy(zielPfad2, tmp);
                strcat(zielPfad2, "\\");
                strcat(zielPfad2, FindFileData.cFileName);
   
             printf("%s\\%s\n",akPfad, FindFileData.cFileName);
       CopyFile(cpyPfad, zielPfad2, false);
       
      
   }
   strcpy(zielPfad2, zielPfad);
   }
  FindClose(hFind); //handle freigeben nicht vergessen
 // return(0);
 }

Bis jetzt habe ich den Code im Dev-C++ Kompiler geschrieben, für die Firma sollte es dann in Visual Studio 2008 Professional sein

Für Augenkrebs hafte ich nicht! ;)
 
Zuletzt bearbeitet:
Okay, ich hab's jetzt ein bisschen anderst gelöst, und man darf staunen, es funktioniert :D JIIIPIII, ich könnt luftsprünge machen.

Hier der Quelltext:

Code:
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <dir.h>

int Verzeichnisse(char*);
int Dateien(char *);
///////////////////////////////////////////////////////////////////////////////
int main()
{
 Verzeichnisse(".");
 Dateien(".");
 system("pause");
 return (0);
}
///////////////////////////////////////////////////////////////////////////////
int Verzeichnisse(char *akPfad)
{
 WIN32_FIND_DATA FindFileData;
 HANDLE hFind = INVALID_HANDLE_VALUE;
 char AkDir[MAX_PATH];
 char nextDir[MAX_PATH];
 char newDir[MAX_PATH];
   
    //Verzeichnis Pfad wird in AkDir (Aktuelles Verzeichnis) kopiert 
 strcpy(AkDir, akPfad);
 strncat(AkDir, "\\*", 3);
  //  strcpy(newDir, "C:\\Dokumente und Einstellungen\\Station3033\\Desktop\\");
  
 hFind = FindFirstFile(AkDir, &FindFileData);
        //Solange noch Daten bzw Dateien vorhanden sind wird diese Schleife durchlaufen
  while (FindNextFile(hFind, &FindFileData) != 0) 
  {
               
                
   if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
    (!strcmp(FindFileData.cFileName, "..") == 0))
   {   
                strcpy(newDir, "C:\\Dokumente und Einstellungen\\Station3033\\Desktop\\");
                strcat(newDir, akPfad);
    strcat(newDir,"\\");
    strcat(newDir,FindFileData.cFileName);
       _mkdir(newDir);
             
    printf("%s\\%s\n",akPfad, FindFileData.cFileName);
    strcpy(nextDir, akPfad);
    strcat(nextDir,"\\");
    strcat(nextDir,FindFileData.cFileName);
   
       
    Verzeichnisse(nextDir);  //rekursiver selbstaufruf
   }
 
   }
  FindClose(hFind); //handle freigeben nicht vergessen
return 0;
    }
 
int Dateien(char *akDat)
{
 WIN32_FIND_DATA FindFileData;
 HANDLE hFind = INVALID_HANDLE_VALUE;
 char AkPfad[MAX_PATH];
 char nextDir[MAX_PATH];
 char oldDatei[MAX_PATH];
 char newDatei[MAX_PATH];
   
    //Verzeichnis Pfad wird in AkDat (Aktuelle Datei) kopiert 
 strcpy(AkPfad, akDat);
 strncat(AkPfad, "\\*", 3);
  //  strcpy(newDir, "C:\\Dokumente und Einstellungen\\Station3033\\Desktop\\");
  
 hFind = FindFirstFile(AkPfad, &FindFileData);
        //Solange noch Daten bzw Dateien vorhanden sind wird diese Schleife durchlaufen
  while (FindNextFile(hFind, &FindFileData) != 0) 
  {
               
                
   if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
    (!strcmp(FindFileData.cFileName, "..") == 0))
   {   
                strcpy(nextDir, akDat);
    strcat(nextDir,"\\");
    strcat(nextDir,FindFileData.cFileName);
   
       
    Dateien(nextDir);  //rekursiver selbstaufruf
   }
   else{
            strcpy(oldDatei, akDat);
            strcat(oldDatei, "\\");
            strcat(oldDatei, FindFileData.cFileName);
            
            strcpy(newDatei, "C:\\Dokumente und Einstellungen\\Station3033\\Desktop\\");
            strcat(newDatei, akDat);
   strcat(newDatei,"\\");
   strcat(newDatei,FindFileData.cFileName);
   
            printf("%s\\%s\n",akDat, FindFileData.cFileName);
            CopyFile(oldDatei, newDatei, false);
      // CopyFile(cpyPfad, zielPfad2, false);
           }
           }
           FindClose(hFind);
      return 0;
}


So jetzt hätte ich noch die Frage ob mir irgendjemand helfen kann, das ganze in Ne grafische Oberfläche zu verpacken! Das wär richtig schön, weil bei der grafischen entwicklung hab ich -n Plan :D

mfg selig
 
wenn die firma sowieso auf VS arbeiten will, zieh dir halt VS express ...

ne simple gui zusammen zu klicken ist kein aufwand (eine durchdachte gui schon ...)

sollte dir eigentlich keine größeren probleme bereiten deinen code da einzubinden

allerdings würde ich dir raten das ziel nicht hardcoded in die funktion zu schreiben, sondern auch einen parameter daraus zu machen ... man könnte bei einem solchen programm sonst irgendwie die möglichkeit vermissen das ziel anzugeben.

über deinen programmierstil könnte man nun streiten, aber das ist glaube ich ein anderes thema
 
Die Zielangabe hatte ich noch vor. Das mein Programmierstil nicht das wahre ist, ist mir bekannt.

Will es ja lernen (Ausbildung)

Vielen Dank, für deine Hilfe, die mir teilweise ziemlich geholfen hat!
 
Zurück
Oben