Удалить файл vs каталог + воссоздать производительность

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

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

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

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

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

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

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

П. С. Сразу уточню, .Нет функции Удалить все файлы в папке сразу и оставить каталог.

5 ответов


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

после обмена с @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();

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


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


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


этот вопрос похож на :" насколько жарко в центре Солнца?"

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

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

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

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