Как удалить файлы с атрибутом только для чтения?
Цитата: yuri от 07.02.2022, 22:18Вот это Я вафля... Папка не удаляется, если у нее есть иконка, извиняюсь, сразу не понял, читать разучился. Сначала подумал, что это из-за иконки в %SystemRoot%\System32\SHELL32.dll выдается исключение, но нет. Любая иконка делает исключение. Очень странно, что пишет: Отказано в доступе. Не имеет значение от Админа или нет. Через cmd да, улетает без прав Админа
Вот это Я вафля... Папка не удаляется, если у нее есть иконка, извиняюсь, сразу не понял, читать разучился. Сначала подумал, что это из-за иконки в %SystemRoot%\System32\SHELL32.dll выдается исключение, но нет. Любая иконка делает исключение. Очень странно, что пишет: Отказано в доступе. Не имеет значение от Админа или нет. Через cmd да, улетает без прав Админа
Цитата: --- НЛО --- от 07.02.2022, 22:46Через CMD я так просто не удалю desktop.ini. Он может быть с атрибутами RHS. Приходится снимать атрибуты.
Список атрибутов есть в Everything.
Через CMD я так просто не удалю desktop.ini. Он может быть с атрибутами RHS. Приходится снимать атрибуты.
Список атрибутов есть в Everything.
Цитата: yuri от 07.02.2022, 22:48Разве ini файл не удаляется вместе с папкой? Например при rd /s /q ...
Изменено: cd /d "Путь" && del /s /f /q *.* && rd /s /q . Это оставит папку удалив все содержимое
Разве ini файл не удаляется вместе с папкой? Например при rd /s /q ...
Изменено: cd /d "Путь" && del /s /f /q *.* && rd /s /q . Это оставит папку удалив все содержимое
Цитата: --- НЛО --- от 07.02.2022, 22:51В CMD удаляется. Наверное C# не может так делать одной командой.
В CMD удаляется. Наверное C# не может так делать одной командой.
Цитата: yuri от 08.02.2022, 03:59В общем, сделал костыль, но может Вам зайдет
[spoiler title="code"]public static void Main(string[] args) { if (!EmptyFolder(args, "*")) { Console.Write("Something happened, I'm trying to use cmd"); Console.ReadKey(true); } } public static bool EmptyFolder(string[] array, string mask) { foreach (string x in array) { if (Directory.Exists(x)) { string BadFolder = x; try { Directory.GetFiles(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y => { try { File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly); File.Delete(y); } catch { } }); Directory.GetDirectories(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y => Directory.Delete(y, true)); return true; } catch { Process.Start(new ProcessStartInfo { // Можете добавить, если хотите сносить все и вся // takeown /f ""{BadFolder}"" /r /d y & icacls ""{BadFolder}"" /grant *S-1-5-32-544:F /t & FileName = "cmd", Arguments = $@"/c cd /d ""{BadFolder}"" & del /s /f /q *.* & rd /s /q .", WindowStyle = ProcessWindowStyle.Hidden }).WaitForExit(); } } } return false; }[/spoiler]
В общем, сделал костыль, но может Вам зайдет
public static void Main(string[] args) {
if (!EmptyFolder(args, "*")) {
Console.Write("Something happened, I'm trying to use cmd");
Console.ReadKey(true);
}
}
public static bool EmptyFolder(string[] array, string mask) {
foreach (string x in array) {
if (Directory.Exists(x)) {
string BadFolder = x;
try {
Directory.GetFiles(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y => {
try {
File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly);
File.Delete(y);
} catch { }
});
Directory.GetDirectories(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y => Directory.Delete(y, true));
return true;
} catch {
Process.Start(new ProcessStartInfo {
// Можете добавить, если хотите сносить все и вся
// takeown /f ""{BadFolder}"" /r /d y & icacls ""{BadFolder}"" /grant *S-1-5-32-544:F /t &
FileName = "cmd",
Arguments = $@"/c cd /d ""{BadFolder}"" & del /s /f /q *.* & rd /s /q .",
WindowStyle = ProcessWindowStyle.Hidden
}).WaitForExit();
}
}
}
return false;
}
Цитата: --- НЛО --- от 08.02.2022, 10:27Привет, yuri 🖐
Хорошо, спасибо Тебе большое. Потом попробую.
Привет, yuri 🖐
Хорошо, спасибо Тебе большое. Потом попробую.
Цитата: --- НЛО --- от 08.02.2022, 22:06Привет, Всем 🖐
Добавил всего одну строку и заработало, начало удалять. Все дело в атрибутах папки.
[spoiler title="Код"]static void EmptyFolder(string[] array, string mask) { foreach (string x in array) { if (Directory.Exists(x)) { try { Directory.GetFiles(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y => { try { File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly); } catch { } try { File.Delete(y); } catch { } }); Directory.GetDirectories(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y => { try { File.SetAttributes(y, FileAttributes.Normal); } catch { } try { Directory.Delete(y, true); } catch { } }); } catch { } } } }[/spoiler]
Привет, Всем 🖐
Добавил всего одну строку и заработало, начало удалять. Все дело в атрибутах папки.
static void EmptyFolder(string[] array, string mask)
{
foreach (string x in array)
{
if (Directory.Exists(x))
{
try
{
Directory.GetFiles(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y =>
{
try { File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly); } catch { }
try { File.Delete(y); } catch { }
});
Directory.GetDirectories(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y =>
{
try { File.SetAttributes(y, FileAttributes.Normal); } catch { }
try { Directory.Delete(y, true); } catch { }
});
}
catch { }
}
}
}