我想以某种方式编写代码,如果有一个文本文件放在指定的路径中,其中一个用户编辑了文件并输入了新文本并保存了它。现在,我想得到的文本是上次附加。 这里有附加文本之前和之后的文件大小
我的文本文件大小是1204kb,我需要单独结束200kb文本才有可能
答案 0 :(得分:4)
只有在您实时监控文件大小时才能执行此操作,因为文件不会保留自己的历史记录。
如果文件被修改是可能的,你可以使用FileSystemWatcher
并在任何修改时计算文件大小的增加。然后,您可以读取自文件上次更改后附加的字节,这将非常简单。
答案 1 :(得分:2)
在用户添加文本之前,您知道文件有多大吗?如果没有,就没有办法告诉......文件没有维护修订历史记录(在大多数文件系统中,无论如何)。
答案 2 :(得分:1)
由于@Jon Skeet在his answer中提到,唯一能够具体说明“附加”文本的方法是通过了解文件在更改之前的大小。其余的字符就是“附加”的内容。
请注意,我引用了上面的内容,因为我从你的问题中得到了两个相互矛盾的含义;编辑和追加。
如果用户只附加文本,这意味着“仅在末尾添加更多文本”,那么理论上应该使用先前大小的方法。
但是,如果用户可以自由地编辑文本,通过在随机位置添加文本,甚至可能删除或更改现有文本,那么您需要一个完整的方法。
如果是后者,我可能会有一些你可以使用的东西,一个二进制补丁实现,也可以用来从同一个文件的旧版本中找出更新版本中更改的内容。它不容易使用,并且可能无法准确地提供您想要的内容,但正如我所说,很难确切地说出您的问题是什么。
答案 3 :(得分:1)
您可以跟踪文件指针。例如,如果您使用的是C语言,则可以使用fseek(fp,SEEK_END)转到文件的末尾,然后使用ftell(fp),它将为您提供文件指针的当前位置。在用户编辑并保存文件后,当您重新运行代码时,可以使用新位置原始位置进行检查。如果新位置大于原始位置,则用文件指针
偏移这些字节数答案 4 :(得分:0)
如果您的程序一直在运行,您可以在内存中获取该文件的副本。然后在一个单独的线程中定期读取新文件并比较两者。
答案 5 :(得分:0)
如果希望在更改文件时通知程序,请使用FileSystemWatcher。但是,它只会在程序运行时更改文件时通知您,并且不会为您提供附加文本。您将只获得有关更改了哪个文件的信息。
FileSystemWatcher watcher = new FileSystemWatcher(Environment.CurrentDirectory, "test.txt");
while (true)
{
var changedResult =
watcher.WaitForChanged(WatcherChangeTypes.Changed);
Console.WriteLine(changedResult.Name);
}
或者:
FileSystemWatcher watcher = new FileSystemWatcher(Environment.CurrentDirectory, "test.txt");
watcher.Changed += watcher_Changed;
static void watcher_Changed(object sender, FileSystemEventArgs e)
{
Console.WriteLine(e.FullPath);
Console.WriteLine(e.ChangeType);
}
答案 6 :(得分:0)
最佳解决方案imo是编写一个小应用程序,必须用它来更改有问题的文件。然后,此应用程序可以在文件中插入其他信息,以便您保留整个修订历史记录。