2009-07-26 6 views
6

指定されたディレクトリのすべてのファイル&サブディレクトリを反復処理せずに削除する方法はありますか?ディレクトリを空にする最も良い方法は何ですか?

非エレガントなソリューション:

public static void EmptyDirectory(string path) 
{ 
    if (Directory.Exists(path)) 
    { 
     // Delete all files 
     foreach (var file in Directory.GetFiles(path)) 
     { 
      File.Delete(file); 
     } 

     // Delete all folders 
     foreach (var directory in Directory.GetDirectories(path)) 
     { 
      Directory.Delete(directory, true); 
     } 
    } 
} 
+0

http://social.msdn.microsoft.com/Forums/vstudio/en-US/2239b45a-3f19-4a2a-b5cd-050b3ee32b9d/how-can-i-check-folder-is-empty-or-not ?forum = csharpgeneral –

答えて

10

System.IO.Directory.Deleteはどうですか?それは再帰オプションを持っています、あなたはそれを使っています。少し違うことをしようとしているように見えるコードを見直してください。削除せずにディレクトリを空にしてください。さて、あなたはそれを削除できますし、それを再作成します:)


いずれにせよ、あなた(またはあなたが使用するいくつかの方法が)ファイルとサブディレクトリのすべてを反復処理しなければなりません。ただし、GetFileSystemInfosを使用して、同時にファイルとディレクトリの両方を反復処理することができます。

foreach(System.IO.FileSystemInfo fsi in 
    new System.IO.DirectoryInfo(path).GetFileSystemInfos()) 
{ 
    if (fsi is System.IO.DirectoryInfo) 
     ((System.IO.DirectoryInfo)fsi).Delete(true); 
    else 
     fsi.Delete(); 
} 
+0

これは素晴らしい解決策ですが、元のコードよりもどのようにエレガントなのか分かりません。私は問題の内容を理解していない。 –

+0

これは、ACLやタイムスタンプなどのすべてのメタデータを削除します。これは特定のユースケースで受け入れられるかもしれません。 – jpaugh

+0

@jpaughディレクトリを削除して再作成すると、それが実行されますが、これはこの解決策ではありません。削除されたファイルを除いて、ACLやタイムスタンプは失われません。もちろん、それらのファイルに関連するすべての情報が失われてしまいます。ファイルが永久になくなった場合、他のものは期待できません。 – BlueMonkMN

3

なぜエレガントではないということですか?それはきれいで、非常に読みやすく、仕事をします。

2

さて、あなたは常にだけDirectory.Deleteを使用することができます....

http://msdn.microsoft.com/en-us/library/aa328748%28VS.71%29.aspx

場合や、 WMIを使用してディレクトリを削除してください。

+0

私は彼の投稿を正しく解釈すれば、彼はディレクトリ、その中のファイルとサブディレクトリだけを削除したくない。 –

+1

はい、真ですが、Directory.Deleteは依然として最良の方法です。ディレクトリを削除して空のディレクトリを再作成するほうが、より洗練されていて、おそらくは反復処理よりも高速です。 – TheSmurf

+0

この方法では、継承されていないディレクトリアクセス権は保持されません。 – Craig

関連する問題