【问题标题】:Fastest way to read file length C#读取文件长度的最快方法C#
【发布时间】:2012-02-29 00:34:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# .net filestream


    【解决方案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
    

    【讨论】:

    • 以这种方式进行基准测试可能不是测试差异的最有效方法(如果有的话)。我想磁盘缓存/操作系统因素将在缩短时间方面发挥重要作用。
    • @PaulG 你说得对。基准测试总是比看起来要复杂。上面的简单基准给出了关于实际结果的一些指示。由于它没有返回 100000 与 250,我认为可以得出结论,这两种方法差别不大(就计算时间而言)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2018-07-10
      • 2012-08-06
      • 2019-07-31
      • 1970-01-01
      相关资源
      最近更新 更多