Является ли свойство .NET FileInfo.Length ленивым? - PullRequest
2 голосов
/ 10 марта 2010

Следующий код создает исключение 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 неверны для примера счетчика.)

Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 марта 2010

Из документов для FileInfo.Length :

При первом вызове FileInfo вызывает Обновить и кэшировать информацию на файл. При последующих звонках вы должны позвоните Обновить, чтобы получить последнюю копию информация.

Кажется, это правильно - похоже, что другие свойства стремятся нарушить их документацию.

2 голосов
/ 10 марта 2010

На мой взгляд, это правильно - объект fileInfo может существовать, даже если в файловой системе такого файла нет! У него все еще может быть имя, каталог и так далее. Однако, когда вы пытаетесь прочитать его длину, его необходимо привязать к фактическому элементу в файловой системе и прочитать длину файла.

* +1002 * UPDATE: Кроме того, из MSDN FileInfo документации для Длина свойство:

При первом вызове FileInfo вызывает Обновить и кэшировать информацию на файл.

Итак, для обновления необходимо, чтобы файл был на месте, в противном случае вы получите исключение.

...