Как правильно удалить файл в. Net Core с C# из папки с большим количеством других файлов или папок - PullRequest
3 голосов
/ 12 марта 2020

Я удаляю файлы в al oop с помощью File.Delete (String) в самом простом. Net Приложение Core Console:

1. foreach (var listing in listings)
2.    File.Delete(listing.Path);

НО проблема в том, что приложение случайно зависает в строке 2, не выдается исключение . После перезапуска приложения несколько файлов удаляются успешно, и приложение снова случайно зависает на другом файле.

Есть несколько моментов, на которые следует обратить внимание:

  • listing.Path - это абсолютный путь к файлу на диске
  • listing.Path выглядит как D:\Output\00000001\6b1c8e6c-7d83-481a-a7db-aac9024059c4.png
  • длина listings массива составляет около 10 элементов
  • file DOES существует в каждом случае
  • Хранение: Seagate Exos 7E8 512E 8 ТБ 7200 об / мин 256 МБ ST8000NM000A 3,5 "SATA III HDD
  • ОС: Windows 10 64x
  • общий размер Output папка 210GB
  • Output папка содержит 137 000 другие папки с Всего 928 000 файлов (приблизительно 5 - 10 файлов в папке)
  • средний размер файла составляет около 350KB

Я подозреваю, что проблема как-то связана с количеством файлов. Но File.Delete должен быть самым надежным способом удаления файла, и он просто зависает без какого-либо разрешения. Понсе на несколько часов. Что заставляет меня убить процесс приложения. Есть ли лучший или более эффективный способ удаления файла?

Обновление: После перемещения всех файлов на другой Windows компьютер в сети с SSD установил и запустил там приложение, оно работало отлично. Так что это может выглядеть как аппаратная проблема. Поэтому я перефразирую заголовок вопроса из Как правильно удалить файл в. Net Core с C# в Как правильно удалить файл в. Net Core с C# из папки с большим количеством других файлов или папок

1 Ответ

0 голосов
/ 12 марта 2020

1) Не ожидайте создания массива с сотнями тысяч имен файлов, а затем l oop через них, удаляющего их очень быстро

2) Файловая система, особенно если каталог находится на общий сетевой ресурс, подключенный диск или используемый другим приложением будет медленным и блокировать операции. Например, обработка, добавляющая новые файлы в каталог как можно быстрее, будет конфликтовать и, возможно, взаимоблокировать с одним, максимально быстро удаляя файлы из того же каталога.

3) Файлы могут быть заблокированы другим процессом

Попробуйте некоторые тесты a) Сколько времени занимает получение списка всех файлов, которые будут удалены? б) Сколько времени занимает удаление 1000 файлов подряд?

Одна система очереди, которую я разработал, имела большое количество файлов: несколько процессов создавали файлы, несколько процессов обрабатывали файлы, а затем удаляли файлы.

У нас было 3 каталога: Inbound, BeingProcessed и ForDeletion

Каждый новый файл помещался во входящий каталог. Другой процесс перемещал файл из входящего каталога в каталог BeingProcessed, открывал и блокировал файл, затем обработайте файл и переместите файл в каталог ForDeletion. Другой процесс удалит файлы в каталоге ForDeletion

.
...