2012-08-03 47 views
10

フォルダとそのすべてのサブフォルダを再帰的に削除しようとしていますが、全く機能していないため、コードをチェックして、 ?Delphiを使用してすべてのファイルとフォルダを再帰的に削除

私は、Windows XPの下でD7を通じて

if FindFirst (FolderPath + '\*', faAnyFile, f) = 0 then 
     try    
     repeat 

      if (f.Attr and faDirectory) <> 0 then 
       begin 
        if (f.Name <> '.') and (f.Name <> '..') then 
         begin        
         RemoveDir(FolderPath +'\'+ f.Name); 
         end 
        else 
         begin 
         //Call function recursively... 
         ClearFolder(FolderPath +'\'+ f.Name, mask, recursive); 
         end; 
       end; 

     until (FindNext (f) <> 0); 
     finally 
     SysUtils.FindClose (f) 
     end; 
end; 
+1

JclFileUtilsからDeleteDirectoryを使用することはどうですか? –

+1

誰かに本当にデバッグする機会を与えるために十分なコードを投稿していないと、私はClearFolderのしくみをどのように知ることができますか?技術的には、人々の推測を推し進めているので、以下の答えが前提となります。それにもかかわらず、あなたの質問は重複ではなく良いです。良いもの。他の同様の質問はすべてあまりにも具体的であり、あなたのタイトルはもっと一般的です。良い。あなたのために+1! –

+1

@Warren質問のコードはClearFolderの本文です。標準的な再帰。 –

答えて

28

をこのコードを実行しているのではなく、すべてこれは、ハードを自分で働いています、私はちょうどSHFileOperationを使用したい:

uses 
    ShellAPI; 

procedure DeleteDirectory(const DirName: string); 
var 
    FileOp: TSHFileOpStruct; 
begin 
    FillChar(FileOp, SizeOf(FileOp), 0); 
    FileOp.wFunc := FO_DELETE; 
    FileOp.pFrom := PChar(DirName+#0);//double zero-terminated 
    FileOp.fFlags := FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION; 
    SHFileOperation(FileOp); 
end; 

それは価値があるものについては、あなたのコードの問題は、DeleteFileを呼び出すことはありません。ディレクトリが空になることはありません。RemoveDirへの呼び出しは失敗します。あなたのコードでのエラーチェックの欠如は本当に助けにはなりませんが、ファイルを削除するコードを追加すると、そのコードは半分の形になります。あなたはまた、再帰を気にする必要があります。すべての子が最初に削除され、次に親コンテナが削除されることを確認する必要があります。それは正しいものになるにはある程度のスキルが必要です。基本的なアプローチは、このようなものです:

procedure DeleteDirectory(const Name: string); 
var 
    F: TSearchRec; 
begin 
    if FindFirst(Name + '\*', faAnyFile, F) = 0 then begin 
    try 
     repeat 
     if (F.Attr and faDirectory <> 0) then begin 
      if (F.Name <> '.') and (F.Name <> '..') then begin 
      DeleteDirectory(Name + '\' + F.Name); 
      end; 
     end else begin 
      DeleteFile(Name + '\' + F.Name); 
     end; 
     until FindNext(F) <> 0; 
    finally 
     FindClose(F); 
    end; 
    RemoveDir(Name); 
    end; 
end; 

私は明瞭にするためにエラーチェックを省略しましたが、あなたはDeleteFileRemoveDirの戻り値をチェックする必要があります。

+0

実際、私は本質的に同じ答えを書こうとしていましたが、私は遅すぎました。 –

+0

あなたのお手伝いをしていただきありがとうDavid。私がそれを削除する前に削除されたフォルダ*のそれぞれでいくつかの操作を行う必要があるという難しい方法をやっている理由があります。各フォルダで行う必要があります... このAPIは、私が個人的に好む優れた高速ソリューションですが、ここではタスク要件のためにこの解決策に固執しています:( – MChan

+0

とにかく、私のアップデートが途中であなたを迎えるべきだと思う。 –

6
procedure DeleteDir(const DirName: string); 
var 
    Path: string; 
    F: TSearchRec; 

begin 
    Path:= DirName + '\*.*'; 
    if FindFirst(Path, faAnyFile, F) = 0 then begin 
    try 
     repeat 
     if (F.Attr and faDirectory <> 0) then begin 
      if (F.Name <> '.') and (F.Name <> '..') then begin 
      DeleteDir(DirName + '\' + F.Name); 
      end; 
     end 
     else 
      DeleteFile(DirName + '\' + F.Name); 
     until FindNext(F) <> 0; 
    finally 
     FindClose(F); 
    end; 
    end; 
    RemoveDir(DirName); 
end; 
+0

これは私の答えのコードとどのように違いますか?私が見ることができる主なことは、RemoveDirが 'If FindFirst'の外にあることですが、それは何の違いもありません。だから、なぜ私の答えにあるのとまったく同じコードで答えを作りましたか?また、それが何であるかを説明するのにも気にしませんでしたか?よくわかりません。 –

+3

@DavidHeffernan - これはコミュニティサイトです。誰もが質問と回答を自由に送信できます。私は本当にあなたの最後の更新を見ていない、ちょうど私のコードを書いて&テストした。 – kludg

+1

OK、コードが本質的に私のものと同じであることがちょっと奇妙に見えて、後で出てくることが分かりました。 –

関連する問題