Dateien+Verzeichnisse - FileCopy mit SHFILEOPSTRUCT



  • Gebe ich unter pFrom direkt einen Text ein, zB
    SHFILEOPSTRUCT myFileOp;
    myFileOp.hwnd = 0;
    myFileOp.wFunc =FO_COPY ;

    myFileOp.pFrom= "c:/blabal.txt";

    dann läuft der Kopiervorgang ganz normal,
    sobald ich aber eine Variable (egal ob CString oder char*) verwende, deren
    Inhalt ich an anderer Stelle aus einem IniFile lese,
    erhalte ich File System Error 1026.
    Im Debug Modus erscheint unter myFileOp.pFrom aber die richtige Adresse, das Ini File
    wird korrekt gelesen!
    Dasselbe geschieht, wenn ich eine CString Variable direkt angebe:
    CString FileDest =" c:/blabla.txt";
    myFileOp.pFrom = FileDest;

    ??? Wo liegt der Fehler, hatte jemand ähnliche Schwierigkeiten??

    [ 03.09.2001: Beitrag editiert von: Jansen ]



  • Hi Mick,

    ich hatte genau das selbe Problem. Irgendwann hatte ich es dann soweit, dass es manchmal ging und manchmal nicht.(War nicht vorhersehbar bzw. für mich unverständlich, da die zu löschende Datei die selbe geblieben ist und zwischen den Aufrufen immer wieder neu erzeugt wurde). Irgendwann hab ich dann die Lust verloren und meine Verzeichnisse mit ´ner Funktion die DeleteFile und rmdir benutzt gelöscht.

    Phips



  • Hi Mick,

    ich hatte ähnliche Probleme. Ich hab dann eigens für die beiden Pfadangaben Variablen spendiert, diese Variablen mit \0 gefüllt, die Pfad- und Fileangaben in die Variablen kopiert und einen Zeiger auf diese Variablen definiert. Diesen Zeiger habe ich an die Struktur übergeben und siehe da es funktionierte!!
    z.B.

    char srcb[20];
    
      char *p1;
      int i;
    
      for (i=0; i<20; i++)
      {
        srcb[i] = '\0';
      }
    
      strcpy(srcb,slSrcDir.c_str());
    
      p1 =  srcb;
    
      sh.pFrom = p1;       // Verzeichnis-Name
    

    [ 17.08.2001: Beitrag editiert von: Jansen ]



  • Hier ist ein Universalcode, der funktionieren müßte.

    #include <ShellApi.hpp>
    
    void __fastcall ExecuteOp(AnsiString From , AnsiString  Dest, int IdOp)
    {
      TSHFileOpStruct *ShFile = new TSHFileOpStruct();
    /*
      For further help on TSHFileOpStruct plese remove the T in the type name
      and press F1
    */
      From = ExpandFileName(From);
      Dest = ExpandFileName(Dest);
    
      char zFrom[MAX_PATH];
      char zDest[MAX_PATH];
    
      for(int i=0; i<MAX_PATH; ++i )
      {
        zFrom[i] = '\0';
        zDest[i] = '\0';
      }
    
      strcpy(zFrom, From.c_str());
      strcpy(zDest, Dest.c_str());
    
      ShFile->hwnd   = GetActiveWindow();
      ShFile->wFunc = IdOp;
      ShFile->pFrom = zFrom;
      ShFile->pTo   = zDest;
    
      if (IdOp != FO_DELETE)
        ShFile->fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;
      else
        ShFile->fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
    
     bool result = SHFileOperation(ShFile);
     ShFile->fAnyOperationsAborted;
     delete ShFile; 
    }
    
    void __fastcall CopyFiles( const AnsiString From, const AnsiString Dest)
    {
      ExecuteOp(From,Dest, FO_COPY);
    }
    
    void __fastcall DeleteFiles( const AnsiString Files )
    {
      ExecuteOp(Files,"", FO_DELETE);
    }
    
    void __fastcall MoveFiles( const AnsiString From, const AnsiString Dest)
    {
      ExecuteOp(From,Dest, FO_RENAME);
    }
    

    [ 09.07.2001: Beitrag editiert von: Happy Builder ]



  • Schade,

    warum hat mir das damals niemand gesagt, das hätte mir ne Menge Zeit gespart.

    Phips


Anmelden zum Antworten