2015-12-14 1 views
5

特定の拡張子のファイルを持っていないすべてのフォルダとサブディレクトリを削除します。しかし、私はすべての空のフォルダと空ではないが、.dvr拡張子のファイルも含んでいないフォルダも削除したい。は、私は特定のパス内のすべての空のフォルダとサブディレクトリを削除するには、このソリューションを使用してい

例えば、私のフォルダにファイルがありますので、

D.DAT

a.log

B.LOG c.dvr

をこのフォルダには、dvr拡張子を持つファイルが含まれているため、削除することはできません。

どうすればフィルタリングできますか? (私はGTK#を使用していますが、このソリューションはC#コードなので、C#コードはうまくいくと思います)

答えて

5

残念ながら、エラー処理はIO操作に基づいて非常に例外的です。ディレクトリが空でない場合、Directory.DeleteはIOExceptionをスローします。ですから、ファイルを手動で削除する必要があります:

+0

あなたのソリューションは、いくつかの変更を加えれば最も効果的でした。 GTK#はany()を受け入れません。だから私は代わりに長さを使用しなければならなかった、それはうまく動作; D – Phiter

2

私はDirectory.EnumerateFilesを使って探しているファイルがあるかどうかを調べます。コードを次のように変更する:

static void Main(string[] args) 
{ 
    processDirectory(@"c:\temp"); 
} 

private static void processDirectory(string startLocation) 
{ 
    foreach (var directory in Directory.GetDirectories(startLocation)) 
    { 
     processDirectory(directory); 
     if (Directory.GetDirectories(directory).Length == 0 || 
      Directory.EnumerateFiles(directory, "*.dvr").Length == 0 
      ) 
     { 
      Directory.Delete(directory, false); 
     } 
    } 
} 
+0

私は同意します。私はあなたの推薦に従って編集しました。 – Avitus

+1

ディレクトリにファイルがある場合、 'Directory.Delete'はIOExceptionをスローするので、手動で削除する必要があることに注意してください。 –

+0

これは.net 4.5または4.6で動作しますが、GTK#は.net 2.0、あらゆる解決策ですか? – Phiter

0

Avitus answerは正しいですが、それは.NET 2.0をで作業する必要があるので、あなたはEnumerateFilesメソッドを使用することはできません、しかしGetFilesはうまく仕事を取得します。しかし、もう少しコードが必要です。

例:

static void Main(string[] args) 
{ 
    processDirectory(@"c:\temp"); 
} 

private static void processDirectory(string startLocation) 
{ 
    foreach (var directory in Directory.GetDirectories(startLocation)) 
    { 
     processDirectory(directory); 

     if (Directory.GetDirectories(directory).Length == 0)) 
     { 
      bool delete = false; 

      var files = Directory.GetFiles(directory); 
      // This will delete the directory if it contains a file with the Extension 
      // of .dvr, regardless if there are other files in there. Might be something you want to change. 
      for (int i = 0; i < files.Length && !delete; i++) 
      { 
       delete = files[i].Extension.Equals(".dvr", StringComparison.OrdinalIgnoreCase); 
      } 

      if (delete) 
      { 
       // Recursive must be set to true in order to 
       // delete files and sub-directories in the folder. 
       // This folder will not have any sub-directories 
       // so it's only used to delete the files. 
       Directory.Delete(directory, /*recursive*/ true); 
      } 
     } 
    } 
} 

あなたが望んでいた場合は、以下のコードの精神でforループ内Directory.Deleteメソッド呼び出しを移動し、その後、ループを破ることができました。

関連する問題