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 に答える