读取文件长度最快的方法C#

时间:2012-02-07 15:11:37

标签: c# .net filestream

我正在使用fs.Length,其中fsFileStream

这是O(1)操作吗?我认为这只会从文件的属性中读取,而不是通过文件来查找搜索位置到达结尾的时间。我试图找到长度的文件可以很容易地从1 MB到4-5 GB。

但是我注意到有一个FileInfo类,它也有一个Length属性。

理论上这两个Length属性是否需要相同的时间?或者fs.Length是否会变慢,因为它必须先打开FileStream

2 个答案:

答案 0 :(得分:34)

获取.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

答案 1 :(得分:27)

两者都将访问文件系统元数据而不是读取整个文件。我不知道哪个更有效率,根据经验,我会说,如果你只想知道长度(和其他元数据),请使用FileInfo - 而如果您要将文件作为流打开,请使用FileStream.Length