Вопрос

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

Спасибо.

Это было полезно?

Решение

Из документов для Файловая информация.Длина:

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

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

Другие советы

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

Обновить:Кроме того, из Документация MSDN FileInfo для Длина свойство:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top