このプログラムの機能は、基本的にログ ファイルを末尾にし、新しく書き込まれた行を転送する必要があります。こことここの他のいくつかの回答で説明されているように、 のストリームとしてオプションを使用FileStream
してを作成することで、これを正しく行っていると思います。FileShare.ReadWrite
StreamReader
しかし、プログラムを実行すると、一部のプロセスがファイルに書き込めなくなります。Process Monitorを使用すると、プログラムが読み取り権限ではなく、読み取り権限でファイルを開いていることがわかります。
reader = new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
{
//start at the end of the file
long lastMaxOffset = reader.BaseStream.Length;
while (true)
{
System.Threading.Thread.Sleep(Properties.Settings.Default.pauseInMilliseconds);
// if the file size has not changed, keep idling
if (reader.BaseStream.Length == lastMaxOffset)
continue;
// handle if the file contents have been cleared
if (reader.BaseStream.Length < lastMaxOffset)
lastMaxOffset = 0;
eventLogger.WriteEntry("LogChipper target file was reset, starting from beginning", EventLogEntryType.Information, 0);
// seek to the last max offset
reader.BaseStream.Seek(lastMaxOffset, SeekOrigin.Begin);
// read out of the file until the EOF
string line = "";
while ((line = reader.ReadLine()) != null)
syslogForwarder.Send(line);
// update the last max offset
lastMaxOffset = reader.BaseStream.Position;
// block if the service is paused or is shutting down
pause.WaitOne();
}
}
ファイルを開いたままにしているそのブロックで私が行っていることは他にありますか? 私はさまざまなアプローチを試すことにオープンです(例:FileSystemWatcher
それがより良い場合)...