Удалить файл против каталога + воссоздать производительность - PullRequest
6 голосов
/ 13 апреля 2011

Какой метод удаления файлов имеет наилучшую производительность?

  • Удаление за файл или
  • Удаление всего каталога с файлами сразу и воссоздание каталога

Просто чтобы заметить, что корневой каталог должен быть все еще там, так что я могу сделать:

var photo_files = Directory.EnumerateFiles(item_path, "*.jpg", SearchOption.TopDirectoryOnly);

foreach (var photo in photo_files)
{
    File.Delete(photo);
}

Или удалите весь каталог, а затем создайте его снова.

Какая разница в производительности будет для 10000 или даже для 100000 файлов?

P.S. Просто для пояснения, в .NET нет функции удаления сразу всех файлов в папке и выхода из каталога.

Ответы [ 5 ]

5 голосов
/ 13 апреля 2011

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

После обмена с @Mr Disappointment я бы предложил следующую поправку к моему ответу:

Если вынужно сделать это "много", тогда вы можете создать себе метод расширения, который выглядит следующим образом:

public static class IOExtension
   {
      public static void PurgeDirectory(this DirectoryInfo d)
      {
         string path = d.FullName;

         Directory.Delete(d.FullName,true);//Delete with recursion
         Directory.CreateDirectory(path);

      }
   }

, так что вы можете просто вызвать его в классе DirectoryInfo, как ...

Directory Info di = new DirectoryInfo(path);
di.PurgeDirectory();
3 голосов
/ 13 апреля 2011

Я бы сказал, что непосредственное удаление каталога дало бы наилучшую производительность, но это предположение, основанное на единственном факторе требований разрешения, запрашиваемых для каждого вызова File.Delete, в отличие от начальной проверки при использовании Directory.Delete - там ' Конечно, в деталях будет еще больше дьяволов.

Оба перебирают файлы, и в конечном итоге оба сводятся к вызову собственных функций Windows для выполнения работы - один раз для каждого файла.

Имейте в виду, что самым большим узким местом при работе с IO на самом деле является аппаратное обеспечение диска, с которого производится чтение или запись.

Вы проверяли это, чтобы увидеть, какие результаты реальны в вашей ситуации?

3 голосов
/ 13 апреля 2011

Что касается точки зрения производительности, вы можете удалить весь каталог и создать заново.После отдыха вам нужно только создать каталог.

0 голосов
/ 14 апреля 2011

Этот вопрос звучит так: «Как горячий центр Солнца?»

Единственный способ узнать наверняка, это пойти туда. Итак, создайте тестовый жгут и отправляйтесь туда.

Создайте папку и поместите одно и то же изображение в папку 10000 раз. Назовите файл с помощью guid или чего-то уникального. Вы можете написать простую программу для этого.

Затем запустите код удаления и рассчитайте время для обоих случаев. При необходимости повторите для подтверждения результатов.

Существует класс секундомера .net, который вы можете использовать для измерения времени. Вы также можете использовать environment.tickcount, чтобы получить время.

0 голосов
/ 13 апреля 2011

Что-то, где-то нужно удалить все файлы. Если вы не делаете это напрямую, то это должно быть сделано для вас косвенно (например, обстрел и вызов «RmDir / S»). Таким образом, система в целом будет работать примерно одинаково. Производительность вашего приложения может варьироваться в зависимости от того, нужно ли вам сначала удалить все файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...