Genie: C++: Dateien verschieben

Hi

Ich hab jetzt endlich mal angefangen, mich in C++ einzuarbeiten. Bis jetzt bleibe ich erstmal bei Konsolenanwendungen.
Jetzt möchte ich ein Programm erstellen, das mir alle Dateien von einem Verzeichnis in ein anderes verschiebt. Was muss ich dafür machen? Welche Headerdateien muss ich einbinden? Gibt es dafür schon eine Funktion oder muss ich erst eine programmieren (und wie sollte die dann aussehen)?

Danke im Vorraus

mfg
Genie

PS: Hat jemand Empfehlungen für Internet-Lektüre über C++ für Anfänger?

  1. Hallo,
    es gibt dafür keine Funktion aus der Standardbibliothek. Du musst dafür betriebssystemspezifische Funktionen verwenden. Siehe auch http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=dirlist#Answ.

    1. Hi

      Das hat zwar noch nicht mein Problem gelöst, trotzdem vielen Dank, jetzt kann ich etwas gezielter suchen

      mfg
      Genie

      1. Für welche Betriebssysteme schreibst du? Wenn es mehrere sind, musst du halt für jedes einen eigenen Code erstellen. Unter Windows kannst du die Kombination FindFirstFile/FindNextFile/FindClose/MoveFile verwenden.

        1. Hi

          Für welche Betriebssysteme schreibst du? Wenn es mehrere sind, musst du halt für jedes einen eigenen Code erstellen. Unter Windows kannst du die Kombination FindFirstFile/FindNextFile/FindClose/MoveFile verwenden.

          Ich wollte mich als Anfänger auf Windows beschränken. Habe jetzt folgendes aus dem Internet rausgeholt und umgewandelt:

            
          bool verschieben(string von, string zu)  
          {  
           string name = von + "*";  
           HANDLE fHandle;  
           WIN32_FIND_DATA wfd;  
           fHandle=FindFirstFile(name.c_str(),&wfd);  
           do  
           {  
            if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))  
            {  
             if(!MoveFile(von + wfd.cFileName, zu + wfd.cFileName)) // hier ist der Fehler  
              return false;  
            }  
           }  
           while (FindNextFile(fHandle,&wfd));  
           FindClose(fHandle);  
           return true;  
          }  
          
          

          In der Zeile

          if(!MoveFile(von + wfd.cFileName, zu + wfd.cFileName))

          meldet er mir:

          <Zeile> <Datei.cpp> cannot convert std::basic\_string<char, std::char\_traits<char>, std::allocator<char> >' to const CHAR*' for argument 1' to BOOL MoveFileA(const CHAR*, const CHAR*)'

          Was soll das heißen und wie kann man es beheben?

          mfg
          Genie

          1. Du verwendest hier die C++-string-Klasse, was auch völlig in Ordnung ist. Die Windows-API-Funktionen erwarten jedoch Zeiger auf nullterminierte Strings. Du kannst string-Objekte mit der c_str()-Funktion in diese Zeiger umwandeln. Genau dies wird beispielsweise im Aufruf
              FindFirstFile(name.c_str(),&wfd)
            gemacht. Das musst du im MoveFile-Aufruf einfach genauso machen:
              MoveFile((von + wfd.cFileName).c_str(), (zu + wfd.cFileName).c_str())

            1. Hi

              Du verwendest hier die C++-string-Klasse, was auch völlig in Ordnung ist. Die Windows-API-Funktionen erwarten jedoch Zeiger auf nullterminierte Strings. Du kannst string-Objekte mit der c_str()-Funktion in diese Zeiger umwandeln.

              Diese Funktion kenne ich

              Genau dies wird beispielsweise im Aufruf
                FindFirstFile(name.c_str(),&wfd)
              gemacht.

              Ich habe sie selbst eingefügt, da ich den Code aus zwei Beispielen zusammengebastelt habe.

              Das musst du im MoveFile-Aufruf einfach genauso machen:
                MoveFile((von + wfd.cFileName).c_str(), (zu + wfd.cFileName).c_str())

              Das habe ich in allen Variationen probiert, seltsamerweise hat es im Gegensatz zu deinem Code nicht funktioniert. Deiner klappt aber.
              Ich hoffe dass ich den Rest alleine programmieren kann, sonst melde ich mich wieder
              Vielen vielen DAnk

              mfg
              Genie