我有一个日志记录解决方案并写入一个文件文件,该文件在应用程序运行时打开。我使用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上
答案 0 :(得分:3)
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
一起使用。
或者,只需关闭此句柄即可更新目录条目以反映当前值。
*(准确地说,只要关闭通过该名称打开的句柄,因为文件可以有多个硬链接。)