2011-07-20 3 views
5

J'utilise ce code pour supprimer des répertoires entiers:Supprimer définitivement des répertoires

uses 
    ShellApi; 

function DelDir(dir: string): Boolean; 
var 
    fos: TSHFileOpStruct; 
begin 
    ZeroMemory(@fos, SizeOf(fos)); 
    with fos do 
    begin 
    wFunc := FO_DELETE; 
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION; 
    pFrom := PChar(dir + #0); 
    end; 
    Result := (0 = ShFileOperation(fos)); 
end; 

Y a-t-il des drapeaux que je peux mettre pour permettre l'élimination permanente des répertoires supprimés?
Par suppression permanente, je veux dire qu'elle n'apparaîtra pas dans la corbeille après qu'elle a été effacée car c'est ce qui arrive quand j'utilise la fonction DelDir.

+2

Quelle est l'élimination permament? Pour qu'il ne puisse pas être recréé? – Jacob

+0

Désolé. Par élimination permanente, je veux dire qu'il n'apparaîtra pas dans la corbeille. – ple103

+0

Message original mis à jour. – ple103

Répondre

4

Essayez de mettre

FileOpStruct.pTo := nil;

Exemple:

function DeleteTree(const APath: String): Boolean; 
var 
    FileOpStruct : TShFileOpStruct; 
    ErrorCode: Integer; 
begin 
    Result := False; 
    if DirectoryExists(APath) then begin 
    FillChar(FileOpStruct, SizeOf(FileOpStruct), #0); 
    FileOpStruct.Wnd := 0; 
    FileOpStruct.wFunc := FO_DELETE; 
    FileOpStruct.pFrom := PChar(APath + #0#0); 
    FileOpStruct.pTo := nil; 
    FileOpStruct.fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOERRORUI or FOF_NOCONFIRMMKDIR; 
    FileOpStruct.lpszProgressTitle := nil; 
    ErrorCode := ShFileOperation(FileOpStruct); 
    Result := ErrorCode = 0; 
    end; 
end; 
+0

Je pense que c'est suffisant avec deux terminateurs NULL (dans 'pFrom'). –

+2

Votre changement suggéré ne fait rien. Le code d'origine utilise déjà ZeroMemory pour définir tous les champs, ce qui place pTo à zéro. Quel est le problème dans le code original, et comment le vôtre le corrige-t-il? –

Questions connexes