Удалить все файлы в каталоге кроме обьявленных

234
09 апреля 2017, 00:19

приветствую. суть вопроса в заголовке. есть приложение которое каждый раз при входе сканирует папку на наличие лишних файлов. лишние это те которые не определены в list. собственно :

   private void DeleteFILES(DAL dal)
    {
        List<string> Equals = new List<string>();
        for (int i = 0; i < dal.getMNamesfromBD().Count; i++)
        {
            Equals.Add(dal.getMNamesfromBD()[i].ToString());
        }
            try
        {
            string CompletePatchToEXE = Directory.GetCurrentDirectory();
            DirectoryInfo dir = new DirectoryInfo(CompletePatchToEXE + @"\\materials\\");
            foreach (FileInfo file in dir.GetFiles())
            {
                for (int i=0; i<dal.getMNamesfromBD().Count; i++)
                {
                    if (file.Name != Equals[i]+ ".jpg")
                    {
                        file.Delete();
                    }
                }
            }
            MessageBox.Show("Файлы поставленные в очереди были успешно удалены!", "Редактирование");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, ex.Source);
        }
    }

однако вместо того что бы удалять файлы не прописанные в Equals код удаляет вообще все файлы. не могу найти ошибку, подскажите где исправить? спасибо!

Answer 1

Код можно сильно упростить, используя LINQ.

Также освойте метод Path.Combine для работы с путями файловой системы.

var materialsDirectory = Path.Combine(Application.StartupPath, "materials");
List<string> Equals = // заполняем список из БД
var distinct = Directory.GetFiles(materialsDirectory)
    .Except(Equals.Select(s => Path.Combine(materialsDirectory, s, ".jpg")));
foreach (var fileName in distinct)
    new FileInfo(fileName).Delete();

Если я правильно понял, в списке только названия файлов без полного пути и без расширения.

P. S. Судя по другим вашим вопросам, папка materials используется во многих местах кода. Поэтому добавьте поле формы, куда занесите нужный путь один раз при старте приложения, а далее просто используйте его.

READ ALSO
Зачем нужен обьект SqlDataAdapter

Зачем нужен обьект SqlDataAdapter

сколько не читал мсдн так и не понял зачем при заполнении datagridview прописывать еще и SqlDataAdapter а DataTable недостаточно? Может вопрос глупый но я хочу...

250
VS Code перестал компилировать программы на C#

VS Code перестал компилировать программы на C#

После мартовского обновления VSCode и обновления dotnet пакета, если пытаюсь запустить программу через терминал командой dotnet run, получаю ошибку:

231
Выбрать все строки из столбца DataTable

Выбрать все строки из столбца DataTable

ПриветствуюУ меня на форме есть DataGridView заполненный таблицей из БД

359
Зачем тут тип dynamic?

Зачем тут тип dynamic?

В C# можно создавать счетчик итераций типа dynamic

200