2 つの C# アプリケーションがあり、1 つはファイル (ファイル A) を 1 行ずつ読み取り、その内容を別のファイル (ファイル B) に書き込みます。
2 番目のアプリケーションは、ファイル B の FileSystemWatcher を使用してファイル B が更新されたことを確認し、プログラムが開始されたときとファイルが変更されたときの行番号の違いを報告しています。
今のところやろうとしているのはそれだけです。最終的には、ファイルが最後に読み取られたときと現在の読み取りの間の行を読み取りたいのですが、保留中の行の違いを取得できるまでです。
アプリケーション 1 のコードは次のとおりです。
static void Main(string[] args)
{
String line;
StreamReader sr = new StreamReader("f:\\watch\\input.txt");
FileStream fs = new FileStream("f:\\watch\\Chat.log", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
while ((line = sr.ReadLine()) != null)
{
sw.WriteLine(line);
Thread.Sleep(200);
Console.WriteLine(line);
sw.Flush();
}
sw.Close();
sr.Close();
}
アプリケーション 2 のコードは次のとおりです。
public static int lines = 0;
public static void Main()
{
Run();
}
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();
if (args.Length != 2)
{
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "Chat.log";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
lines = File.ReadAllLines(args[1] + "\\Chat.log").Length;
Console.WriteLine("File lines: " + lines);
while(Console.Read()!='q');
}
private static void OnChanged(object source, FileSystemEventArgs e)
{
Linework(e.FullPath);
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
public static string Linework(string path)
{
string newstring = " ";
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
int newlines = File.ReadAllLines(path).Length;
Console.WriteLine("Lines now: " + newlines);
}
return newstring;
}
これら 2 つのアプリケーションを一緒に実行しようとすると、「未処理の例外: System.IO.IOException: 別のプロセスで使用されているため、プロセスはファイルにアクセスできません」という例外が発生します。
私は両方のファイル ストリームを ReadWrite アクセス用にセットアップしており、ファイル ストリームの 1 つを FileAccess.Write 用にセットアップし、もう 1 つを FileAccess.Read 用にセットアップしています。
なぜこの例外が発生するのかについての手がかりはありますか?
ありがとうございます。