StreamWriter打开时,不会更新修改日期

时间:2016-03-25 12:12:09

标签: c# windows windows-7 streamwriter

我有一个日志记录解决方案并写入一个文件文件,该文件在应用程序运行时打开。我使用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上

1 个答案:

答案 0 :(得分:3)

FindNextFile返回的修改日期是存储在目录条目中的缓存值,而不是存储在MFT记录中的始终更新值(等效的inode)。这是出于性能原因,因此可以通过单个读取获取整个目录的信息,而不是每个文件的读取。

只要文件句柄关闭,它就会更新。*

您始终可以使用GetFileInformationByHandleGetFileInformationByHandleEx获取最新信息。要使用此功能,您应该使用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一起使用。

或者,只需关闭此句柄即可更新目录条目以反映当前值。

*(准确地说,只要关闭通过该名称打开的句柄,因为文件可以有多个硬链接。)