если вы имеете в виду только текст "Betheme", чем добавить
print(var.text)
Вот дополнительный метод, который устанавливает 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();
}
Лучшее решение состоит в том, чтобы отметить все файлы как нетолько для чтения, и затем удалить каталог.
// 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));
Уведомление, что ~ является Побитовый логический оператор, который возвращает дополнение данного двоичного значения. Я не протестировал это, но это должно работать.
Спасибо!
Я сказал бы, что Ваш первый подход выглядит более явным и читаемым. Вторые запахи метода как отражение, не безопасно с точки зрения типов и выглядит странным. Эти ManagementObject
может представить несколько вещей, таким образом, не очевидно, что .InvokeMethod("Delete")
на самом деле удаляет каталог.
Вещь, что мне не нравится приблизительно первый подход (directory.delete), имеет место, где существуют подкаталоги, которые также содержат файлы только для чтения, и у них есть подкаталоги, которые имеют файлы только для чтения также и так далее. Кажется, что необходимо было бы выключить тот флаг для каждого файла в каталоге и всех подкаталогах рекурсивно.
Со вторым подходом, можно просто удалить тот первый каталог, и он не проверяет, только ли файлы для чтения. Однако это - первый раз, когда я использовал WMI в C#, таким образом, я не все это довольное им. Таким образом, я не уверен, когда пойти с подходом WMI для других приложений, вместо того, чтобы просто использовать Систему. Методы IO.
На первый взгляд, использование подхода WMI кажется более эффективным, чем итерация по всей файловой системе (допустим, например, в каталоге есть десятки тысяч файлов). Но я не знаю, что WMI тоже не выполняет итераций. Если это так, то, будучи ближе к металлу (опять же, предположения), он должен быть более эффективным.
Для элегантности я признаю, что рекурсивный метод - это круто.
Тестирование производительности должно дать ответ на вопрос об эффективности. И любой из них может быть элегантным, если заключен в метод расширения DirectoryInfo.
Другой метод, не требующий рекурсии.
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);
}
Попробуйте это,
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);
}