3

ネットワーク共有に保存されているファイルを読み取るプロセスが多数あります。もともと、ファイルを読み取れるプロセスは 1 つだけで、他のすべてのプロセスは例外をスローしていました。それに対処するために次のコードを実装しました。

using (StreamReader fileStreamReader = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)))
{
   content = fileStreamReader.ReadToEnd();
}

これにより、複数のプロセスが同じファイルを読み取ることができますが、複数のプロセスがファイルにアクセスできない場合があるため、まだ問題があるようです。それでも、ファイルが使用されていないときに後で戻って、問題なく開くことができます。現在、ランダムな遅延が実装された再試行動作がいくつかあり、これまでのところ役に立っているようです。このようにするのは少し風変わりに思えるので、より良い方法は何でしょうか?

これは奇妙な部分です。私が取得している例外は、ファイル IO からではなく、CommStudio というライブラリからのものです。要するに、ファイルを文字列にダンプし、少し変更してメモリ ストリームにダンプし、rs232 の ymodem 経由で出荷します。例外は、リモート システムがキャンセルされたことを示しています。データを取得するデバイスは、転送エラーが発生したことを報告します。これは通常、不完全または空のファイルが受信されたことを意味します。

通常、私はこれをライブラリのせいにしますが、机上のテストや、ファイルにアクセスするプロセスが 1 つしかない場合は問題なく動作します。実際に一貫しているように見える唯一のことは、複数のプロセスがファイルにアクセスしているときに失敗する可能性が高いということです。

4

2 に答える 2

2

同様の問題がありましたが、理想的な解決策を見つけるのに時間がかかりませんでした。私は Web サービスを作成し、ファイルを Web サービス アプリのローカルに貼り付けました。次に、オフィスのイントラネット経由で呼び出される単純なワンライナー GET API を作成しました。したがって、呼び出し元のアプリケーションのみがログ ファイルを編集するようにしました。面倒ですが機能的です。

于 2010-02-25T23:35:26.433 に答える
1

私は過去に同様の問題を抱えていました。ファイルへのアクセス方法を次のように変更してみてください。

//Use FileInfo to get around OS locking of the file
FileInfo fileInfo = new FileInfo(path); 
//I actually wanted unblocked read write access so change your access and share appropriately
using (FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.ReadWrite))
{
    //I'm using CopyTo but use whatever method matches your need
    fileInfo.CopyTo(Path.Combine(destination, fileName), false);
}
于 2010-02-26T03:14:47.967 に答える