Вы должны войти, чтобы создавать сообщения и темы.

Как удалить файлы с атрибутом только для чтения?

1◄Страница 3 из 3

Вот это Я вафля... Папка не удаляется, если у нее есть иконка, извиняюсь, сразу не понял, читать разучился. Сначала подумал, что это из-за иконки в %SystemRoot%\System32\SHELL32.dll выдается исключение, но нет. Любая иконка делает исключение. Очень странно, что пишет: Отказано в доступе. Не имеет значение от Админа или нет. Через cmd да, улетает без прав Админа

Через CMD я так просто не удалю desktop.ini. Он может быть с атрибутами RHS. Приходится снимать атрибуты.
Список атрибутов есть в Everything.

Разве ini файл не удаляется вместе с папкой? Например при rd /s /q ...

Изменено: cd /d "Путь" && del /s /f /q *.* && rd /s /q . Это оставит папку удалив все содержимое

В CMD удаляется. Наверное C# не может так делать одной командой.

В общем, сделал костыль, но может Вам зайдет

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;
}

Лайкнул Удаленный пользователь
Удаленный пользователь

Привет, yuri 🖐
Хорошо, спасибо Тебе большое. Потом попробую.

Привет, Всем 🖐
Добавил всего одну строку и заработало, начало удалять. Все дело в атрибутах папки.

Код

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 { }
        }
    }
}

Лайкнул yuri
yuri
1◄Страница 3 из 3