Est-ce que la propriété FileInfo.Length de .NET paresseux?
-
19-09-2019 - |
Question
Le code suivant génère un FileNotFoundException (en utilisant 2,0 .NET):
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));
}
}
}
}
Il ressemble à la propriété Length est paresseux. Y at-il raison? Cela semble être une incohérence, car il est pas le cas avec d'autres propriétés. (Voir .NET FileInfo.LastWriteTime & FileInfo.LastAccessTime sont mal un contre-exemple).
Merci.
La solution
De la documentation FileInfo.Length :
Lors de la première appelé, les appels FileInfo Actualisez et met en cache des informations sur la fichier. Lors des prochains appels, vous devez appeler refresh pour obtenir la dernière version de les informations.
Cela semble être correct - il semble que ce sont les autres propriétés étant désireux qui porte atteinte à leur documentation
.Autres conseils
À mon avis, il est correct - l'objet Fileinfo peut exister même si il n'y a pas un tel fichier dans le système de fichiers! Il peut encore avoir un nom, un répertoire et ainsi de suite. Toutefois, lorsque vous essayez de lire sa longueur, il doit être lié à l'élément réel dans le système de fichiers et de lire la longueur du fichier.
Mise à jour: En outre, à partir de documentation MSDN FileInfo < em> Longueur propriété:
Lors de la première appelé, les appels FileInfo Actualisez et met en cache des informations sur la fichier.
Ainsi, l'actualisation a besoin du fichier pour être mis en place, sinon vous obtenez une exception.