Как удалить каталог с файлами только для чтения в C #? - PullRequest
53 голосов
/ 04 марта 2009

Мне нужно удалить каталог, содержащий файлы только для чтения. Какой подход лучше:

  • Использование DirectoryInfo.Delete() или

  • ManagementObject.InvokeMethod("Delete")?

При DirectoryInfo.Delete() мне приходится вручную отключать атрибут «только для чтения» для каждого файла, но ManagementObject.InvokeMethod("Delete") не требуется Есть ли ситуации, когда одно предпочтительнее другого?

Пример кода (test.txt только для чтения).

Первый способ:

DirectoryInfo dir = new DirectoryInfo(@"C:\Users\David\Desktop\");
dir.CreateSubdirectory("Test");

DirectoryInfo test = new DirectoryInfo(@"C:\Users\David\Desktop\Test\");
File.Copy(@"C:\Users\David\Desktop\test.txt", @"C:\Users\David\Desktop\Test\test.txt");
File.SetAttributes(@"C:\Users\David\Desktop\Test\test.txt", FileAttributes.Archive);
test.Delete(true);

Второй способ:

DirectoryInfo dir = new DirectoryInfo(@"C:\Users\David\Desktop\");
dir.CreateSubdirectory("Test");

DirectoryInfo test = new DirectoryInfo(@"C:\Users\David\Desktop\Test\");
File.Copy(@"C:\Users\David\Desktop\test.txt", @"C:\Users\David\Desktop\Test\test.txt");

string folder = @"C:\Users\David\Desktop\Test";
string dirObject = "Win32_Directory.Name='" + folder + "'";
using (ManagementObject managementObject = new ManagementObject(dirObject))
{
    managementObject.Get();
    ManagementBaseObject outParams = managementObject.InvokeMethod("Delete", null,
    null);
    // ReturnValue should be 0, else failure
    if (Convert.ToInt32(outParams.Properties["ReturnValue"].Value) != 0)
    {
    }
}

Ответы [ 11 ]

0 голосов
/ 08 июня 2009

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

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

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

...