Является ли FileInfo.Свойство длины .NET ленивым?
-
19-09-2019 - |
Вопрос
Следующий код генерирует исключение 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 вызывает Обновление и кэширует информацию о файле .
Итак, для обновления необходимо, чтобы файл был на месте, в противном случае вы получите исключение.