SHFileOperation grotten langsam ?



  • Hallo,

    ich habe folgenden Code aus der Borland FAQ

    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;  
    }
    

    Ich rufe diese Funktion aus einer Schleife heraus auf und übergebe ihr immer ein File.

    for(int i = 0; i < FileList->Count; i++)
        {
        // ein Objekt wird aus TList->TFiledata gecastet
        TFiledata * pItem;
        pItem = (pFiledata)FileList->Items[i];
        ExecuteOp(pItem->Path + pItem->Name, NewFileName(pItem, NewFileExt, NewPath), SWITCH);
        }
    

    Führe ich jetzt eine Operation mit diesen Funktionen aus (z.B.Files löschen), so dauert die Aktion ca. eine Sekunde pro File!!! Ich habe das auf mehreren Rechner geprüft und das Ergebnis war immer das gleiche. Selbst auf einen 2 GHZ System! Ich denke das das unakzeptabel langsam ist und wollte mal nachfragen wie eure Erfahrungen damit sind, und ob ich vielleicht etwas sehr falsch mache.

    Die schelchte Performance kommt definitiev von SHFileOperation. Ich habe zwei Debugger Punkte gesetzt, einen hier:

    bool result = SHFileOperation(ShFile);
    

    und einen hier:

    delete ShFile;
    

    Ein Sprung von einem Punkt zum nächsten dauerte ca eine Sekunde :(, während der rest des Programmes sehr schnell ablief.

    Hat jemand eine Idee?

    thx!



  • Du scheinst ja mit VCL zu arbeiten - vielleicht wärst du dann im BCB-Forum besser aufgehoben 🙄
    Was sagt denn GetLastError()? Sind die Pfade, die du übergibst auf jeden Fall richtig? (evtl. einfach mal ausgeben lassen)

    ExecuteOp(pItem->Path + pItem->Name, NewFileName(pItem, NewFileExt, NewPath), SWITCH);
    

    Ist am Ende von pItem->Path ein /?
    Was macht NewFileName?
    Was ist SWITCH?



  • Ja shFileOperation ist so langsam. Aber statt shFileOperation immer wieder aufzurufen, kannst du als Quelle (und Ziel) mehrer Dateinamen angeben, dann geht es deutlich schneller. (Sieh Dir dazu nochmal die Parameterbeschreibung an.)


Anmelden zum Antworten