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

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

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

Добрый день! 🖐
Делаю программу которая удаляет все файлы в папке "E:\Data\Downloads", но у меня там могут быть файлы с атрибутом только для чтения.
На меня ругается компилятор, не знаю почему.
Как это правильно сделать?

Спойлер

Скопированоvoid Button1Click(object sender, EventArgs e)
Скопировано    {
Скопировано    ClrDir(@"E:\Data\Downloads");
Скопировано    }

Скопированоpublic static void ClrDir(string path)
Скопировано{
Скопировано    DirectoryInfo fldr = new DirectoryInfo(path);
Скопировано    foreach (FileInfo file in fldr.GetFiles)
Скопировано    {
Скопировано        file.IsReadOnly = false;
Скопировано        file.Delete();
Скопировано    }
Скопировано    foreach (DirectoryInfo dir in fldr.GetDirectories())
Скопировано        dir.Delete(true);
Скопировано} 

Добрый🖐.
Думаю добавить перед file.Delete строчку file.Attributes = FileAttributes.Normal;

«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Добрый день.
Ругается потому что СкопированоGetFiles()(скобки в конце).
Как-то никогда не заморачивался, но не думаю, что этот флаг будет мешать удалению.

Привет 🖐
Много раз переписывал подход к удалению всего и вся из каталога.
И вот уже два года не трогаю. Сделал окончательно и навсегда:

// Удалить всё содержимое
public 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 { Directory.Delete(y, true); } catch { }
                });
            }
            catch { }
        }
    }
}

Даже не пробуй Скопированоforeach менять на Скопировано.ToList().ForEach (в данном случае). Студия даже не напишет о вероятном конфликте потоков между AsPrallel и ForEach, и что готовое приложение гарантированно будет пропускать файлы из-за потоков в потоке.
Поэтому можешь даже не вникать в этот парадокс, просто бери именно Мой код, как есть, лучше уже не написать.

Лайкнули Сергей, Удаленный пользователь и Владислав
СергейУдаленный пользовательВладислав
В любой непонятной ситуации переходи на beta  © Win 10 Tweaker

Привет, и Спасибо XpucT! 🖐
Кто знает как этого потрошителя соединить чтобы он начал удалять?

Скриншот


Подскажите пожалуйста.

Добрый день.
Читайте внимательно, у вас же в сообщении об ошибке все написано, вы вместо массива Скопированоstring[] пытаетесь использовать одиночный Скопированоstring. Если у вас не массив, а одна строка, то пишите Скопировано{@"E:\Data\Downloads"}

P.S. Вам действительно удобно в белой теме работать?

Привет, Adler! 🖐
А как переключить SharpDevelop на темную тему?

Оффтоп
SharpDevelop не поддерживает темы =)

В любой непонятной ситуации переходи на beta  © Win 10 Tweaker

Упс. Никак, не досмотрел. Решил, что у вас VS...

Спасибо Вам всем за ответы.
У меня не работает так, но зато прекрасно работает вот так. Наверное старый NET Framework. SharpDevelop поддерживает максимум только 4.5.2.

Или я ошибся решив, что будет так работать...

Тему можно закрывать.
Спасибо Большое Хачатуру за потрошителя.

Лайкнул XpucT
XpucT

Привет, Всем 🖐
У меня этот код не удаляет папку в которой есть папка с иконкой (не .ico). То это уже никак не исправить из C#? Нужно CMD вызывать?
Вот так я запускал.

Код

using System;
using System.IO;
using System.Linq;

namespace Delete
{
    class Program
    {
        public static void Main(string[] args)
        {
            EmptyFolder(args, "*");
            Console.Write("Готово");
            Console.ReadKey(true);
        }

        // Удалить всё содержимое от XpucT
        public 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 { Directory.Delete(y, true); } catch { }
                        });
                    }
                    catch { }
                }
            }
        }
    }
}

Добрый вечер, что-то у Меня не получает воссоздать Вашу проблему, можете дать папку, которая не удаляется?

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