c# - StreamWriter 打开时修改日期不会更新

标签 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

最佳答案

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 一起使用。

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

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

关于c# - StreamWriter 打开时修改日期不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36219705/

相关文章:

c++ - Qt & SSL,握手失败

c# - ASP C# : Special characters: #, $,+ 无法通过 URL 参数

mysql - 最新版本的 mysql2 和 mysql gems 需要 mysql 6.0。如何在 5.x 中使用它?

python - 我如何从 Python 中枚举文件系统?

windows - git 克隆卡在 "checking connectivity"

python - 如何允许打开文件名中包含 Unicode 字符的文件?

javascript - 防止 Internet Explorer 11 中的过度滚动

c# - 如何异步调用事件?

c# - 如何让 Scroll 与垂直方向的 Hub Control Windows Phone 8.1 应用程序一起工作

c# - ASP.NET 中的静态 C# 类变量是什么?