jam*_*o00 10 .net c# filesystemwatcher ipc file
在Linux中,许多IPC都是通过在一个进程中附加文件并从另一个进程读取新内容来完成的.
我想在Windows/.NET中执行上述操作(使用普通IPC(如管道)太麻烦).我将附加到Python进程中的文件,我想在每次FileSystemWatcher报告事件时读取更改并且只读更改.每次我在寻找更改时,我都不想将整个文件内容读入内存(文件会很大)
每个追加操作都会附加一行数据,这些数据以唯一的递增计数器(时间戳+键)开头,并以换行符结束.
And*_*rey 28
using (FileStream fs = new FileStream
(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader sr = new StreamReader(fs))
{
while (someCondition)
{
while (!sr.EndOfStream)
ProcessLinr(sr.ReadLine());
while (sr.EndOfStream)
Thread.Sleep(100);
ProcessLinr(sr.ReadLine());
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将帮助您只读取附加的行
Joã*_*elo 10
您可以存储上次读取操作的偏移量,并在获得更改的文件通知时将文件搜索到该偏移量.一个例子如下:
主要方法:
public static void Main(string[] args)
{
File.WriteAllLines("test.txt", new string[] { });
new Thread(() => ReadFromFile()).Start();
WriteToFile();
}
Run Code Online (Sandbox Code Playgroud)
从文件方法中读取:
private static void ReadFromFile()
{
long offset = 0;
FileSystemWatcher fsw = new FileSystemWatcher
{
Path = Environment.CurrentDirectory,
Filter = "test.txt"
};
FileStream file = File.Open(
"test.txt",
FileMode.Open,
FileAccess.Read,
FileShare.Write);
StreamReader reader = new StreamReader(file);
while (true)
{
fsw.WaitForChanged(WatcherChangeTypes.Changed);
file.Seek(offset, SeekOrigin.Begin);
if (!reader.EndOfStream)
{
do
{
Console.WriteLine(reader.ReadLine());
} while (!reader.EndOfStream);
offset = file.Position;
}
}
}
Run Code Online (Sandbox Code Playgroud)
写入文件方法:
private static void WriteToFile()
{
for (int i = 0; i < 100; i++)
{
FileStream writeFile = File.Open(
"test.txt",
FileMode.Append,
FileAccess.Write,
FileShare.Read);
using (FileStream file = writeFile)
{
using (StreamWriter sw = new StreamWriter(file))
{
sw.WriteLine(i);
Thread.Sleep(100);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10053 次 |
| 最近记录: |