Есть ли способ получить размер файла в .NET с помощью статического метода? - PullRequest
36 голосов
/ 28 сентября 2011

Я знаю, что обычным способом получения размера файла будет использование экземпляра FileInfo:

using System.IO;
class SizeGetter
{
  public static long GetFileSize(string filename)
  {
    FileInfo fi = new FileInfo(filename);
    return fi.Length;
  }
}

Есть ли способ сделать то же самое, не создавая экземпляр FileInfo, используя статический метод?

Возможно, я пытаюсь быть слишком скупым при создании нового экземпляра каждый раз, когда мне нужен размер файла, но, к примеру, я пытаюсь вычислить общий размер каталога, содержащего более 5000 файлов. Каким бы оптимизированным ни был сборщик мусора, разве не должно быть способа сделать это без необходимости излишне облагать налогом?

Ответы [ 3 ]

17 голосов
/ 28 сентября 2011

Не беспокойся об этом.

  • Я нашел сообщение в блоге того, кто измерял накладные расходы на создание объектов в .NET ( C # Time Creation Time Trials ), и, как оказалось, создание 10000 объектов заняло 0,03 секунды, то есть 3 мкс на объект. Время, необходимое для считывания длины файла из файловой системы, несомненно, будет значительно превышать эти 3 микросекунды.

  • Множество статических методов в .NET Framework внутренне создают объекты и вызывают для них методы экземпляров (вы можете убедиться в этом, посмотрев на справочный источник или используя какой-либо инструмент отражения). Вы предполагаете , что статический метод быстрее. Не делайте таких предположений. Если у вас есть два способа сделать то же самое, измерьте , какой из них быстрее.

16 голосов
/ 28 сентября 2011

Не беспокойся об этом.Во-первых, размещение в .NET дешево.Во-вторых, этот объект будет в поколении 0, поэтому он должен быть собран без особых накладных расходов.

3 голосов
/ 25 мая 2014

Если вам действительно нужен статический метод, используйте собственный GetFileSize или GetFileSizeEx API.Но имейте в виду, что для этого потребуется дескриптор файла из CreateFile API.

Вы также можете просмотреть источник класса FileInfo:

http://referencesource.microsoft.com/#mscorlib/system/io/fileinfo.cs#4ee673c1a4ecad41

...