From the MSDN documentation for the FileInfo.Name
property, I see that the data for the property is cached the first time it is called and will only be updated subsequently by using the Refresh
method.
I've the following questions which I can't find or aren't too clear in the documentation:
Is the data for all properties cached at the same time?
Is the Refresh
method called on creation of the FileInfo
, or only when a property is called for the first time?
If I've called one property, e.g. the Name
property, and it's called Refresh
, will calling a different property, e.g. the DirectoryName
property, for the first time cause it to call Refresh
again, or is it only called by the first property accessed in the entire class (see question #1)?
Can I pre-cache all the properties by calling Refresh
manually? (Assuming it's not pre-cached on construction of the object)
Does calling Refresh
manually cause properties which are pre-cached, e.g. CreationTime
, to be refreshed as well?
The value of the CreationTime property is pre-cached if the current
instance of the FileSystemInfo object was returned from any of the
following DirectoryInfo methods:
- GetDirectories
- GetFiles
- GetFileSystemInfos
- EnumerateDirectories
- EnumerateFiles
- EnumerateFileSystemInfos
To get the latest value, call the Refresh method.
If the file described in the FileSystemInfo object does not exist,
this property will return 12:00 midnight, January 1, 1601 A.D. (C.E.)
Coordinated Universal Time (UTC), adjusted to local time.
NTFS-formatted drives may cache file meta-info, such as file creation
time, for a short period of time. This process is known as file
tunneling. As a result, it may be necessary to explicitly set the
creation time of a file if you are overwriting or replacing an
existing file.
(MSDN)
Internally, Refresh
calls the standard Win32API and thus fills all properties.
[...]
flag2 = Win32Native.GetFileAttributesEx(path, 0, ref data);
Accessing any property that is specified to Refresh causes a full refresh, for instance:
public DateTime LastAccessTimeUtc
{
[SecuritySafeCritical]
get
{
if (this._dataInitialised == -1)
{
this._data = default(Win32Native.WIN32_FILE_ATTRIBUTE_DATA);
this.Refresh();
}
[...]