我有一个日志记录解决方案,并写入一个在应用程序运行时打开的文本文件。我使用 StreamWriter 写入文件。我的记录器代码很简单(打开流并写入):
public void Open(string filePath, bool append)
{
if (this.logWriter != null)
throw new InvalidOperationException(
"Logger is already open");
if (!Directory.Exists(Path.GetDirectoryName(filePath)))
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
this.logWriter = new StreamWriter(filePath, append);
this.logWriter.AutoFlush = true;
}
public void CreateEntry(string entry)
{
if (this.logWriter == null)
return;
this.logWriter.WriteLine(entry);
}
问题是,在写入文件时,条目被写入,文件大小正在改变,但“修改日期”属性没有改变。有什么想法吗?如何手动更新修改日期?
PS:我使用的是 Windows 7
最佳答案
FindNextFile 返回的修改日期是存储在目录项中的缓存值,而不是存储在 MFT 记录中的始终更新的值(相当于 inode )。这是出于性能考虑,因此一次读取即可获取整个目录的信息,而不是读取每个文件。
只要文件句柄关闭,它就会更新。*
您始终可以使用 GetFileInformationByHandle
或 GetFileInformationByHandleEx
获取最新信息。要使用此功能,您应该使用 CreateFile
打开文件,同时既不请求读取也不写入访问权限并允许共享。
HANDLE hFile = CreateFile(_T("Path/To/File"),
0, // No read or write access needed
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING, // Don't create
0, NULL);
此句柄可以与 GetFileInformationByHandleEx
一起使用。
或者,只需关闭此句柄即可更新目录条目以反射(reflect)当前值。
*(准确地说,每当通过该名称打开的句柄关闭时,因为一个文件可以有多个硬链接(hard link)。)
关于c# - StreamWriter 打开时修改日期不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36219705/