Самый быстрый способ прочитать длину файла C # - PullRequest
22 голосов
/ 07 февраля 2012

Я использую fs.Length, где fs - это FileStream.

Это операция O(1)?Я думаю, что это будет просто читать из свойств файла, а не просматривать файл, чтобы найти, когда позиция поиска достигла конца.Длина файла, который я пытаюсь найти, может легко варьироваться от 1 МБ до 4-5 ГБ.

Однако я заметил, что существует класс FileInfo, который также обладает свойством Length.

Теоретически оба эти свойства Length занимают одинаковое количество времени?Или медленнее fs.Length, потому что он должен сначала открыть FileStream?

Ответы [ 2 ]

34 голосов
/ 07 февраля 2012

Естественный способ получить размер файла в .NET - это свойство FileInfo.Length , которое вы упомянули.

Я не уверен, что Stream.Length медленнее(он все равно не будет читать весь файл), но определенно более естественно использовать FileInfo вместо FileStream, если вы не планируете читать файл.


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

private static void Main(string[] args)
{
    string filePath = ...;   // Path to 2.5 GB file here

    Stopwatch z1 = new Stopwatch();
    Stopwatch z2 = new Stopwatch();

    int count = 10000;

    z1.Start();
    for (int i = 0; i < count; i++)
    {
        long length;
        using (Stream stream = new FileStream(filePath, FileMode.Open))
        {
            length = stream.Length;
        }
    }

    z1.Stop();

    z2.Start();
    for (int i = 0; i < count; i++)
    {
        long length = new FileInfo(filePath).Length;
    }

    z2.Stop();

    Console.WriteLine(string.Format("Stream: {0}", z1.ElapsedMilliseconds));
    Console.WriteLine(string.Format("FileInfo: {0}", z2.ElapsedMilliseconds));

    Console.ReadKey();
}

Результаты :

Stream: 886
FileInfo: 727
28 голосов
/ 07 февраля 2012

Оба будут обращаться к метаданным файловой системы, а не к чтению всего файла. Я не знаю, какой из них более эффективен, как правило, я бы сказал, что если вы только хотите знать длину (и другие метаданные), используйте FileInfo - тогда как если вы В любом случае, чтобы открыть файл как поток, используйте FileStream.Length.

...