【问题标题】:How to detect file rename from open Stream如何从打开的流中检测文件重命名
【发布时间】:2011-05-19 13:34:54
【问题描述】:

问题:

是否可以检测具有打开 FileStream 的文件何时被重命名。

案例:

我正在尝试监视我们应用程序的日志,我从日志文件中读取,因为我不想干扰日志记录本身。

在文件滚动之前,这非常有效。我的应用程序一直在读取重命名的文件,甚至没有注意到。

尝试使用 FileSystemWatcher 来检测滚动,但有时会收到很多事件,有时我不会,所以这不是一个好的解决方案(日志文件也可能驻留在网络共享可能是使用 FSW 的额外阻碍)。

如果我能找出我有一个打开句柄的文件(名称),我可以将它与_fileName 进行比较,但我不知道如何或是否可以这样做。

我还有其他选择吗?

代码:

这是我的文件监控类的简化版本:

public class MonitorFile
{
    private String _fileName = String.Empty;
    private bool _stopMonitoring = false;

    public MonitorFile(string fileName)
    {
        _fileName = fileName;
    }

    // Simplified method
    public void StartMonitoring()
    {
        using (var reader = new StreamReader(
                    new FileStream(
                        _monitorFileName,
                        FileMode.Open,
                        FileAccess.Read,
                        FileShare.Delete | FileShare.ReadWrite)))
        {
            while (!_stopMonitoring)
            {
                Thread.Sleep(500);

                while ((line = reader.ReadLine()) != null)
                {
                    //...Do stuff with the lines
                }
            }
        }
    }
}

【问题讨论】:

    标签: c# .net file-io windows-services


    【解决方案1】:

    有一个 MSDN 示例使用 Win32 API 显示 how you can obtain a file name from a file handle(您可以通过 FileStreamHandle 属性访问),但我怀疑这种方法是否适用于远程网络共享上的文件。

    在一般情况下,您很可能不走运。

    【讨论】:

    • 谢谢,您的回答将我引向了一个非常棒的 C# 实现 stackoverflow(乍一看)
    【解决方案2】:

    您可以从监控文件路径中提取目录名称。 然后在你的 readLine 循环之后: 获取目录中的文件列表,按最后更新日期排序 取列表中的第一项 将其与您正在读取的文件名进行比较,如果它们不同,请更新您的阅读器

    这是假设只有目录中的文件是日志文件并且您总是希望从最近更新的文件中读取数据

    【讨论】:

    • 不幸的是,我的具体问题并非如此。我们的应用程序将许多不同的日志文件写入同一个文件夹。
    【解决方案3】:

    假设滚动文件具有不同/更新的创建日期,您能否比较之前监控读取期间文件的创建日期?访问和修改时间可能没有用,但创建日期可能有用。

    您可以尝试System.IO.File.GetCreationTime,尽管可能还有其他影响因素,例如:

    NTFS 格式的驱动器可以缓存文件 元信息,例如文件创建时间, 很短的一段时间,也就是 称为“文件隧道”。作为一个 结果,可能需要 显式设置 a 的创建时间 文件,如果你正在覆盖或 替换现有文件。

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多