Подтвердить что ты не робот

Самый быстрый способ прочитать длину файла С#

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

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

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

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

4b9b3361

Ответ 1

Естественным способом получить размер файла .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

Ответ 2

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