Eine xcopy - Anwendung ( Verzeichnisse kopieren )



  • Hallo,

    ich benötige eine Anwendung, die mir ein Verzeichnis ( mit Unterverzeichnissen ) kopiert. Das Quell- und das Zielverzeichniss soll über die Parameter der Anwendung übergeben werden.
    Hier mal mein Ansatz:

    #include "stdafx.h"
    #include <windows.h>
    #include <shellapi.h>
    #include <iostream>
    
    #ifndef MAX_PATH
       #define MAX_PATH 255
    #endif
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
       SHFILEOPSTRUCT sFileOperation;
    
       sFileOperation.fAnyOperationsAborted = false;
    
       memset( &sFileOperation, 0, sizeof( SHFILEOPSTRUCT ) );
    
       if( argc == 3 )
       {
          sFileOperation.pFrom = argv[1];
          sFileOperation.pTo = argv[2];
    
          sFileOperation.wFunc = FOF_FILESONLY;
    
    		sFileOperation.fFlags |= ( FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SIMPLEPROGRESS );
    
          if( ::SHFileOperation(&sFileOperation) == 0 )
          {
             // succeeded
             // ---------
             return 0;
          }
          else
          {
             // error during fileoperation
             // --------------------------
             DWORD dwError;
             dwError = GetLastError();
    
             cout << dwError << endl;
             cout << sFileOperation.pFrom << " " << sFileOperation.pTo << endl;
             getchar();
    
             return -2;
          }
       }
       else
       {
          // wrong parameter count
          // ---------------------
          return -1;
       }
    }
    

    Wieso lande ich immer im "error during fileoperation" Zweig meiner Verschachtelung? Mach ich noch irgendwas mit den Parametern falsch? Liegt es mal wieder an irgendwelchen Datentypumwandlung, die ich dafür machen müsste?

    Schon mal vielen Dank im vorraus
    Mr.Yellow



  • pFrom und pTo müssen doppelt Null-Terminiert sein, das ist wahrscheinlich bei Dir nicht der Fall.
    Kopiere lieber die Argumente argv in einen Puffer und hänge noch eine Null 'dran.



  • Ich habe jetzt mal die Terminierung hinzugefügt:

    TCHAR tcSource[MAX_PATH];
          TCHAR tcDest[MAX_PATH];
    
          memcpy( tcSource, argv[1],  34  );
          memcpy( tcDest, argv[2], 16 );
    
          tcSource[17] = '\0';
          tcSource[18] = '\0';
    
          tcDest[8] = '\0';
          tcDest[9] = '\0';
    
          sFileOperation.pFrom = tcSource;
          sFileOperation.pTo = tcDest;
    

    Laut Quickwatch beim debuggen, werden in die sFileOperation Struktur auch die richtigen Werte für pFrom und pTo eingetragen. Klappt aber leider immer noch nicht so richtig und ich lande noch immer im selben Zweig in der Verzweigung.

    Mr.Yellow



  • Du hast auch deine Struct falsch initialisiert - in wFunc gehört die auszuführende Operation rein (für dich FO_COPY) und keine Kontrollflags.



  • Du solltest lieber schreiben.

    ZeroMemory(tcSource,sizeof(tcSource));
    lstrcpy(tcSource,argv[1]); //Rest ist NULL
    
    ZeroMemory(tcDest,sizeof(tcDest));
    lstrcpy(tcDest,argv[2]);
    


  • CStoll (off) schrieb:

    Du hast auch deine Struct falsch initialisiert - in wFunc gehört die auszuführende Operation rein (für dich FO_COPY) und keine Kontrollflags.

    Das ist auch richtig (habe es übersehen). Ich hatte aber auch schon Probleme, wenn die Strings nicht doppelt Null-Terminiert waren.



  • Habt vielen Dank ...
    läuft nun einwandfrei.

    MfG
    Mr.Yellow


Anmelden zum Antworten