C# 如何获取文件的增量内容

C# 如何获取文件的增量内容,c#,system.reactive,C#,System.reactive,我正在使用名为ReactiveFileSystemWatcher的NuGet包,其中observeFileSystemwatcher是围绕FileSystemWatcher的可观察包装器 我的文本文件不断添加新内容,我只想抓取增量更改 下面的代码会在文件内容发生更改时发出通知,但我想在文件中添加什么内容 using RxFileSystemWatcher; using System; using System.Linq; using System.Reactive.Linq; namespac

我正在使用名为
ReactiveFileSystemWatcher
的NuGet包,其中
observeFileSystemwatcher
是围绕
FileSystemWatcher
的可观察包装器

我的文本文件不断添加新内容,我只想抓取增量更改

下面的代码会在文件内容发生更改时发出通知,但我想在文件中添加什么内容

using RxFileSystemWatcher;
using System;
using System.Linq;
using System.Reactive.Linq;

namespace ConsoleApp1
{
class Program
{
    static void Main(string[] args)
    {

        using (var watcher = new ObservableFileSystemWatcher(c => { c.Path = @"C:\Test\"; c.IncludeSubdirectories = true; }))
        {
            watcher.Changed.Select(x => $"{x.Name} was {x.ChangeType}").Subscribe(Console.WriteLine);
            watcher.Start();
            Console.ReadLine();
        }
    }

}
}

如果你知道文件总是被追加,并且中间没有发生变化,你可以通过跟踪你所观看的所有文件的长度来解决这个问题。当有任何更改时,您只需将文件内容从旧长度读取到文件的新端即可

Dictionary<string, long> lengthByFilename = new Dictionary<string, long>();
// TODO: recurse through all existing files to get their lengths and put in 
//       the dictionary

watcher.Changed.Select(x => {
    string addedContent;
    using (var file = File.OpenRead(x.Name)) {
        // Seek to the last known end position
        if (lengthByFilename.ContainsKey(x.Name)) {
            file.Seek(lengthByFilename[x.Name], SeekOrigin.Begin);
        }

        using (var reader = new StreamReader(file)) {
            addedContent = reader.ReadToEnd();
        }
    }

    // Update dictionary with new length
    lengthByFilename[x.Name] = (new FileInfo(x.Name)).Length;

    return $"{x.Name} has had this added: {addedContent}";
}).Subscribe(Console.WriteLine);
Dictionary lengthByFilename=新字典();
//TODO:递归所有现有文件以获取其长度并放入
//字典
watcher.Changed.Select(x=>{
字符串添加内容;
使用(var file=file.OpenRead(x.Name)){
//寻找最后一个已知的结束位置
if(lengthByFilename.ContainsKey(x.Name)){
Seek(lengthByFilename[x.Name],SeekOrigin.Begin);
}
使用(var reader=newstreamreader(文件)){
addedContent=reader.ReadToEnd();
}
}
//使用新长度更新字典
lengthByFilename[x.Name]=(新文件信息(x.Name)).Length;
return$“{x.Name}已经添加了以下内容:{addedContent}”;
}).Subscribe(Console.WriteLine);

显然,这段代码严重缺乏错误处理,但这只是一个开始。您必须捕获IOException,并考虑如何以适当的方式处理锁定的文件。您可能需要实现一个事件队列,可以对其进行迭代以尝试并重新尝试读取新内容。

文件系统不会跟踪该事件,您需要通过比较新数据和旧数据来手动确定增量。确定,感谢您的信息这将无法获取订阅创建后添加的新文件,不是吗?我认为不会。如果文件名未知,则此代码不会搜索,而是读取整个文件,然后将新文件的大小正确存储在字典中。新条目永远不会添加到字典中,此外,不会
lengthByFilename[x.Name]=…
如果字典中没有
x.Name
则抛出?创建新文件时,观察者会做出反应并调用Select lambda func。x、 Name然后包含添加的文件的名称。索引器
lengthByFilename[x.Name]=…
可以在字典中进行添加和更新。我猜你更喜欢Java而不是C?不是Java,C实际上是我的背景。。。正在考虑访问不在dic中的密钥,而不是添加/更新。这就是我在JS上看得太久的原因——在类型化的langs中过度使用防御性编码!