2009-10-19 8 views
1

J'utilise le code suivant pour supprimer un grand nombre de fichiersObtenir fenêtres SHFileOperation 'API pour supprimer récursivement fichiers dans Delphi

function FastDelete(const fromDir: string): Boolean; 
var 
    fos: TSHFileOpStruct; 
begin 
    ZeroMemory(@fos, SizeOf(fos)); 
    with fos do 
    begin 
    wFunc := FO_DELETE; 
    fFlags := FOF_FILESONLY or 
       FOF_NOCONFIRMATION or 
       FOF_NO_CONNECTED_ELEMENTS or 
       FOF_NOERRORUI or 
       FOF_NO_UI; 
    pFrom := PChar(fromDir+'\*.*' + #0); 
    end; 
    Result := (0 = ShFileOperation(fos)); 
end; 

Comment puis-je à supprimer récursive tous les fichiers dans le chemin?

MSDN documentation

EDIT

Le problème est le FOF_FILESONLY drapeau Après la suppression des fichiers sont supprimés récursive

Répondre

4

De l'MSDN documentation:

FOF_NORECURSION

Effectuez uniquement l'opération dans le répertoire local. N'utilisez pas récursivement dans les sous-répertoires, qui est le comportement par défaut.

On dirait que c'est votre réponse là. Il devrait se reproduire automatiquement à moins que vous ne le demandiez.

EDIT: On dirait qu'il y a un problème avec vos drapeaux. Vous devez ou ensemble, ne pas les ajouter ensemble. Puisque FOF_NO_UI inclut déjà FOF_NOERRORUI, l'ajouter à nouveau peut changer la valeur, et vous pourriez ajouter accidentellement certaines choses qui s'ajoutent à FOF_NORECURSION. Cela devrait ressembler à ceci:

fFlags := FOF_FILESONLY or 
       FOF_NOCONFIRMATION or 
       FOF_NO_CONNECTED_ELEMENTS or 
       FOF_NOERRORUI or 
       FOF_NO_UI; 
+0

Salut Mason - Je n'utilise pas FOF_NORECURSION comment dois-je changer mon code pour qu'il supprime récursivement les fichiers dans les sous-répertoires? –

+0

Il devrait le faire récursivement par défaut. Vérifiez ma modification. –

+0

En outre, vous ne savez pas vraiment si le masque '\ *. *' Est nécessaire si vous supprimez le répertoire entier. Passant la fonction le répertoire lui-même devrait être suffisant – EagleOfToledo

1

Devez-vous également conserver le répertoire? Sinon, vous pouvez simplement passer

pFrom := PChar(fromDir+#0); 

Une autre option est de construire une liste de chemins de fichiers-délimités 0 #, et passer que avec un supplément # 0, de msdn:

Bien que ce membre est déclaré comme une chaîne terminée par un caractère nul, il est utilisé comme un tampon pour contenir plusieurs noms de fichiers. Chaque nom de fichier doit être terminé par un seul caractère NULL. Un caractère NULL supplémentaire doit être ajouté à la fin du nom final pour indiquer la fin de pFrom.

Questions connexes