【问题标题】:Getting new lines from a file with FileSystemWatcher使用 FileSystemWatcher 从文件中获取新行
【发布时间】:2009-07-29 08:46:40
【问题描述】:

我正在观看一个包含以下代码的文件:

        [..]
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = @"C:\";
        watcher.Filter = "t.log";
        watcher.Changed += new FileSystemEventHandler(watcher_Changed);
        watcher.EnableRaisingEvents = true;

        private static void watcher_Changed(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("Changed!");
        }
        [..]

这行得通。现在,假设文件 t.log 的内容是:

row 1
row 2
row 3
row 4

当我向文件中添加(并保存)几行时,文件变为:

row 1
row 2
row 3
row 4
row 5
row 6

如何检索添加的行是“第 5 行”和“第 6 行”?

请注意,文件可能非常大,因此不能将其内容保存在内存中并与新版本进行比较。同样,存储最后读取行的值并从其开始计数也是不可能的,因为它会迫使我每次都读取整个文件,而且可能存在具有相同值的行。

非常感谢任何帮助。

【问题讨论】:

  • 能否在日志文件的每一行中添加一个时间戳字段?

标签: c# logging filesystems


【解决方案1】:

如果它是一个日志,总是附加的,你可以保持文件大小和变化:

using (FileStream fs = new FileStream("t.log", FileAccess.Read))
{
  fs.Seek(previousSize, SeekOrigin.Begin);
  //read, display, ...
  previousSize = fs.Length;
}

【讨论】:

  • 根据 FileAccess,您可能会看到竞争条件。如果允许并发写入,最好做类似previousSize += fs.read ...
【解决方案2】:

我认为它可以工作的唯一用例是当您只添加行时。然后简单地存储行数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多