2

以下代码生成 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));
            }
        }
    }
}

看起来 Length 属性是惰性的。有什么理由吗?这似乎是不一致的,因为其他属性并非如此。(有关反例,请参阅.NET FileInfo.LastWriteTime 和 FileInfo.LastAccessTime 错误。)

谢谢。

4

2 回答 2

4

来自FileInfo.Length的文档:

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

这似乎是正确的 - 看起来是其他属性急切违反了他们的文档。

于 2010-03-10T15:53:35.760 回答
2

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

更新:另外,来自Length属性的MSDN FileInfo 文档:

首次调用时,FileInfo 调用 Refresh 并缓存文件信息。

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

于 2010-03-10T15:52:26.247 回答