(a)が最適だと思います。理由は次のとおりです。
- 現在の位置は読むにつれて増加し、どこかに保存することを心配する必要はありません。
- ポーリングするたびに、開いて必要な位置を探す必要はありません(再度開くのにそれほど時間がかかることはありませんが、開いたままにしておくと、OSに最適化のヒントが得られます)。
- 私が考えることができる他の解決策は、システム間同期プリミティブをシステム化するためにPInvokesを必要とします。また、すでにフレームワークにあるファイル操作よりも高速になることはありません。
適切なFileShareフラグを設定する必要があります。
ちょうど例:
サーバ:
using(var writer = new BinaryWriter(new FileStream(@"D:\testlog.log", FileMode.Append, FileAccess.Write, FileShare.Read)))
{
int n;
while(Int32.TryParse(Console.ReadLine(), out n))
{
writer.Write(n);
writer.Flush(); // write cached bytes to file
}
}
クライアント:
using (var reader = new BinaryReader(new FileStream(@"D:\testlog.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
{
string s;
while (Console.ReadLine() != "exit")
{
// allocate buffer for new ints
Int32[] buffer = new Int32[(reader.BaseStream.Length - reader.BaseStream.Position) / sizeof(Int32)];
Console.WriteLine("Stream length: {0}", reader.BaseStream.Length);
Console.Write("Ints read: ");
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = reader.ReadInt32();
Console.Write((i == 0 ? "" : ", ") + buffer[i].ToString());
}
Console.WriteLine();
}
}