2010-08-13 3 views
2

Я использую функцию для моего приложения, которое при нажатии кнопки проверяет диск «C: \» (и все подкаталоги, только для чтения или нет) и удаляет все файлы с определенными расширениями файлов. Как мне это сделать? Я уверен, что будет использован список или массив ... но это все, что я знаю.Как сканировать весь диск и удалять все файлы (только для чтения) с несколькими конкретными расширениями файлов?

Пожалуйста, .Net framework 2.0 ТОЛЬКО!

ответ

1

Прогулка по дереву каталогов. Необходимый код описан here.

+0

Я чувствую эти примеры довольно устаревшие, так как API, перечисленные, может рекурсию для вы, передав дополнительный аргумент. Так зачем писать дополнительные 50 строк кода, когда вы можете просто передать дополнительный параметр? –

+0

@CJohnson: Хотя, если вы прочтете ссылку, вы увидите, что причина, по которой это делается шаг за шагом, - сделать ее лучше при обработке ошибок (о которых я и не думал о моем ответе). Поэтому, думая об этом, может быть много кода, но это, наверное, самый безопасный способ. –

1
foreach (string filename in Directory.EnumerateFiles(@"C:\", "*.xxx", SearchOption.AllDirectories) 
{ 
    File.Delete(filename); 
} 
+0

'EnumerateFiles' не рекурсивно. –

+1

@Marcelo Cantos: он делает это в моем тесте. Вы на самом деле пробовали? –

+0

Хорошо, что в EnumerateFiles он сразу же возвращает каталоги, а не после того, как он перескакивает через все каталоги. Он идеально подходит для получения результатов сразу. В противном случае GetFiles делает то же самое, но возвращается только после того, как все файлы были извлечены. У вас есть тысячи каталогов, которые могут занять некоторое время. Поэтому этот метод полезен, если вы хотите выполнить многопоточную операцию над LOTS каталогами. –

1
foreach (String file in Directory.GetFiles("c:\\","*.iddqd", SearchOption.AllDirectories)) 
     File.Delete (file); 
+0

Я довольно уверен, что var был НЕ в .NET 2.0. –

+0

Вы правы, я отредактировал свой ответ –

+0

Я думаю, что 'var' является зависимым от компилятора, а не зависимым от структуры, поэтому его можно использовать в .Net 2.0, если вы его компилируете в VS2008 или позже, так что в теории вы ошибаетесь (но я бы предположил, что когда в запросе упоминается .Net 2.0, вполне вероятно, что на самом деле это VS2005 с .Net 2.0, поэтому на практике ваш комментарий, вероятно, правильный). –

1

Я думаю, что следующий код будет работать:

using System.IO; 

... 


string[] extensions = { "*.apa", "*.dip", "*.ep" }; // whatever extensions you care about 
foreach (string ext in extensions) 
{ 
    foreach (string file in Directory.GetFiles(@"c:\", ext, SearchOption.AllDirectories)) 
    { 
      File.SetAttributes(file, FileAttributes.Normal); 
      File.Delete(file); 
    } 
} 
+0

лучший вид ответа iv, но до сих пор я получаю ошибку, подобную этой «доступ к пути» c: \ windows \ system32 \ logfiles \ wmi \ rtbackup 'отрицается. Что случилось? – NightsEVil

+0

@NightsEvil: Да, я забыл о том, что, вероятно, не стоит делать опцию AllDirectories, если вы хотите искать весь системный диск, потому что в некоторых каталогах это не удастся, и тогда это приведет к сбою всей операции. Вместо этого вам придется делать рекурсивный путь, как описанный в статье в ответе Марсело Кантоса, где, если он терпит неудачу с одним каталогом, он просто проигнорирует это исключение и продолжит со следующего. –

+0

может быть сработано с тем, как вы это сделали, просто изменилось? причина из всех ответов – NightsEVil

1

попробовать это:

DirectoryInfo directoryInfo = new DirectoryInfo(@"directory path"); 
     foreach (var f in directoryInfo.GetFiles("*.*", SearchOption.AllDirectories)) 
     { 
      f.Delete(); 
     }