.NET的FileInfo.Length属性是懒惰的吗?

时间:2010-03-10 15:48:00

标签: .net file-io lazy-evaluation

以下代码生成FileNotFoundException(使用.NET 2.0):

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace LazyFileInfoTest
{
    class Program
    {
        static void Main(string[] args)
        {
            File.WriteAllText("Test.txt", "Hello World!");

            DirectoryInfo di = new DirectoryInfo(".");

            FileInfo[] files = di.GetFiles();

            File.Delete("Test.txt");

            foreach (FileInfo fi in files)
            {

                Console.WriteLine(string.Format("{0} Last Modified: {1}", fi.Name, fi.LastWriteTime));
                Console.WriteLine(string.Format("{0} Last Modified: {1}", fi.Name, fi.LastAccessTime));
                //Exception when we reach test.txt
                Console.WriteLine(string.Format("{0} length is: {1}", fi.Name, fi.Length));
            }
        }
    }
}

看起来长度属性是懒惰的。有什么理由吗?这似乎是一种不一致,因为与其他属性不同。 (有关反例,请参阅.NET FileInfo.LastWriteTime & FileInfo.LastAccessTime are wrong。)

感谢。

2 个答案:

答案 0 :(得分:4)

来自FileInfo.Length的文档:

  

首次调用时,FileInfo调用   刷新并缓存有关的信息   文件。在随后的通话中,您必须   调用Refresh以获取最新的副本   信息。

这似乎是正确的 - 看起来这是其他属性急于侵犯他们的文档。

答案 1 :(得分:2)

在我看来,它是正确的 - 即使文件系统中没有这样的文件,fileInfo对象也可以存在!它仍然可以有一个名称,一个目录等等。 但是,当您尝试读取其长度时,需要将其绑定到文件系统中的实际项目并读取文件的长度。

更新: 此外,从MSDN FileInfo documentation获取长度属性:

  

首次调用时,FileInfo调用   刷新并缓存有关的信息   文件。

因此,刷新需要文件到位,否则会出现异常。