Как пропустить файлы при удалении, которые открыты в другой программе c#?

Рейтинг: 0Ответов: 1Опубликовано: 17.06.2023
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# их просто пропускал?

Ответы

▲ 0Принят

Можно воспользоваться следующим алгоритмом как одним из вариантов решения:

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. Такой алгоритм позволяет избежать случаев, когда удаление всех остальных элементов в папке отменяется из-за наличия одного заблокированного файла или папки.