Как я удаляю каталог с файлами только для чтения в C#?

если вы имеете в виду только текст "Betheme", чем добавить

print(var.text)
54
задан Sam 13 August 2014 в 00:42
поделиться

7 ответов

Вот дополнительный метод, который устанавливает Attributes на Normal рекурсивно, затем удаляет объекты:

public static void DeleteReadOnly(this FileSystemInfo fileSystemInfo)
{
    var directoryInfo = fileSystemInfo as DirectoryInfo;    
    if (directoryInfo != null)
    {
        foreach (FileSystemInfo childInfo in directoryInfo.GetFileSystemInfos())
        {
            childInfo.DeleteReadOnly();
        }
    }

    fileSystemInfo.Attributes = FileAttributes.Normal;
    fileSystemInfo.Delete();
}
88
ответ дан Vitaliy Ulantikov 7 November 2019 в 07:35
поделиться

Лучшее решение состоит в том, чтобы отметить все файлы как нетолько для чтения, и затем удалить каталог.

// delete/clear hidden attribute
File.SetAttributes(filePath, File.GetAttributes(filePath) & ~FileAttributes.Hidden);

// delete/clear archive and read only attributes
File.SetAttributes(filePath, File.GetAttributes(filePath) 
    & ~(FileAttributes.Archive | FileAttributes.ReadOnly));

Уведомление, что ~ является Побитовый логический оператор, который возвращает дополнение данного двоичного значения. Я не протестировал это, но это должно работать.

Спасибо!

2
ответ дан 2 revsSocratees 7 November 2019 в 07:35
поделиться

Я сказал бы, что Ваш первый подход выглядит более явным и читаемым. Вторые запахи метода как отражение, не безопасно с точки зрения типов и выглядит странным. Эти ManagementObject может представить несколько вещей, таким образом, не очевидно, что .InvokeMethod("Delete") на самом деле удаляет каталог.

1
ответ дан Thomas Eyde 7 November 2019 в 07:35
поделиться

Вещь, что мне не нравится приблизительно первый подход (directory.delete), имеет место, где существуют подкаталоги, которые также содержат файлы только для чтения, и у них есть подкаталоги, которые имеют файлы только для чтения также и так далее. Кажется, что необходимо было бы выключить тот флаг для каждого файла в каталоге и всех подкаталогах рекурсивно.

Со вторым подходом, можно просто удалить тот первый каталог, и он не проверяет, только ли файлы для чтения. Однако это - первый раз, когда я использовал WMI в C#, таким образом, я не все это довольное им. Таким образом, я не уверен, когда пойти с подходом WMI для других приложений, вместо того, чтобы просто использовать Систему. Методы IO.

1
ответ дан David Hodgson 7 November 2019 в 07:35
поделиться

На первый взгляд, использование подхода WMI кажется более эффективным, чем итерация по всей файловой системе (допустим, например, в каталоге есть десятки тысяч файлов). Но я не знаю, что WMI тоже не выполняет итераций. Если это так, то, будучи ближе к металлу (опять же, предположения), он должен быть более эффективным.

Для элегантности я признаю, что рекурсивный метод - это круто.

Тестирование производительности должно дать ответ на вопрос об эффективности. И любой из них может быть элегантным, если заключен в метод расширения DirectoryInfo.

0
ответ дан 7 November 2019 в 07:35
поделиться

Другой метод, не требующий рекурсии.

public static void ForceDeleteDirectory(string path)
{
    DirectoryInfo root;
    Stack<DirectoryInfo> fols;
    DirectoryInfo fol;
    fols = new Stack<DirectoryInfo>();
    root = new DirectoryInfo(path);
    fols.Push(root);
    while (fols.Count > 0)
    {
        fol = fols.Pop();
        fol.Attributes = fol.Attributes & ~(FileAttributes.Archive | FileAttributes.ReadOnly | FileAttributes.Hidden);
        foreach (DirectoryInfo d in fol.GetDirectories())
        {
            fols.Push(d);
        }
        foreach (FileInfo f in fol.GetFiles())
        {
            f.Attributes = f.Attributes & ~(FileAttributes.Archive | FileAttributes.ReadOnly | FileAttributes.Hidden);
            f.Delete();
        }
    }
    root.Delete(true);
}
5
ответ дан 7 November 2019 в 07:35
поделиться

Попробуйте это,

private void DeleteRecursiveFolder(string pFolderPath)
{
    foreach (string Folder in Directory.GetDirectories(pFolderPath))
    {
        DeleteRecursiveFolder(Folder);
    }

    foreach (string file in Directory.GetFiles(pFolderPath))
    {
        var pPath = Path.Combine(pFolderPath, file);
        FileInfo fi = new FileInfo(pPath);
        File.SetAttributes(pPath, FileAttributes.Normal);
        File.Delete(file);
    }

    Directory.Delete(pFolderPath);
}
9
ответ дан 7 November 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: