我有一个日志logging解决scheme,并写入到应用程序正在运行时打开的文本文件。 我使用StreamWriter来写入文件。 我的logging器代码很简单(打开stream和写):
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); }
问题在于写入文件时,条目被写入,文件大小正在改变,但“修改date”属性不会改变。 有什么想法吗? 我如何手动更新修改date?
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
一起使用。
或者,简单地关闭这个句柄将更新目录条目以反映当前值。
*(准确地说,每当通过该名称打开的句柄关闭时,由于文件可以有多个硬链接)。