Как пропустить файлы при удалении, которые открыты в другой программе c#?
string userRoot = Environment.GetEnvironmentVariable("USERPROFILE");
string paths = string.Format("{0}\\AppData\\Local\\Temp", userRoot);
DirectoryInfo folder = new DirectoryInfo(paths);
foreach (FileInfo file in folder.GetFiles())
{
file.Delete();
}
foreach (DirectoryInfo dir in folder.GetDirectories())
{
dir.Delete(true);
}
Это мой код: он удаляет всё из папки %temp%
Есть вопрос: при удалении находятся файлы, которые открыты в системных программах. Так вот, можно ли сделать так, чтобы при виде таких файлов c# их просто пропускал?
Ответы (1 шт):
Можно воспользоваться следующим алгоритмом как одним из вариантов решения:
using System;
using System.IO;
namespace NsSkipFiles {
class SkipFiles {
static void DeleteDirectory(DirectoryInfo folder) {
foreach (FileInfo file in folder.GetFiles()) try { file.Delete(); } catch { }
foreach (DirectoryInfo dir in folder.GetDirectories()) DeleteDirectory(dir);
try { folder.Delete(); } catch { }
}
static void Main() {
DeleteDirectory(new DirectoryInfo(
string.Format("{0}\\AppData\\Local\\Temp"
, Environment.GetEnvironmentVariable("USERPROFILE"))));
}
}
}
Метод DeleteDirectory вызывается рекурсивно. В нём сначала удаляются файлы в папке, потом удалятся подпапки рекурсивным вызовом, потом удаляется сама папка. Файлы, которые заблокированы другими приложениями, игнорируются с помощью try catch. Такой алгоритм позволяет избежать случаев, когда удаление всех остальных элементов в папке отменяется из-за наличия одного заблокированного файла или папки.