使用中のファイルを単に「読み取る」ことはできますか?
-
03-07-2019 - |
質問
StreamReaderを使用してファイルを読み取ろうとしていますが、常に別のプロセスで使用されているため、このエラーが発生します:
プロセスはファイルにアクセスできません '\ arfjwknasgmed17 \ C $ \ FLAG CONDITION \ CP-ARFJN-FLAG.XLS ' 別のプロセスで使用されています。
これをコピーせずに読む方法はありますか?それとも私の唯一の選択肢ですか?
解決
ファイルを開くことができるのは、ファイルを開いたプログラムが最初にそのファイルの共有権限を読み取った場合のみです。
ファイルに実際に読み取り共有権限がない場合、そもそもコピーすることはできません。
既にファイルを開いているプログラムの共有権と競合する共有権を指定している場合、ファイルにアクセスできない場合があります。たとえば、既に開いているプログラムが書き込みアクセスを許可していない場合、書き込みアクセスを許可することはできません。
最初にファイルを開いたプログラムがボリュームシャドウコピー(VSS)をサポートしている場合、VSSを使用してファイルにアクセスすることもできます。
これらのファイルが使用中であっても、そのようなファイルにアクセスできる商用ソフトウェアドライバーがあります。以前はSt-BernardsによってOpen File Managerを取得できていましたが、 File Access Manager(FAM)を使用することもできました。 by VisionWorks Solutions Inc.これらのドライバーは、通常、製品に含めるためにバックアップソフトウェア会社にOEM供給されています。
VSSは、ファイルを既に開いているプログラムに、別のプログラムがそのファイルから読み取りたいことを伝えることで機能します。 VSSはファイルのコピーを実行し、このコピーから読み取ることができます。 VSSはレガシーアプリケーションでは機能しません。
FAMは、排他的に開かれロックされたファイルにアクセスできるアプリケーションの「許可リスト」を指定することで、レガシープログラムと非レガシープログラムの両方で透過的に機能します。このリスト内のプログラムのみがこれらのファイルへのアクセスを許可されます。ファイルが開かれると、キャッシュモードになり、ファイルの「バックアップ/オープン」が開始されたときのファイルのコピーを取得します。この時点で、ファイルを最初に開いたプログラムはファイルを実際に表示し、許可リストの2番目のプログラムは、ファイルの「オープン/バックアップ」が発生したときのファイルを表示します。これにより、ファイルの一貫性が保証されます。
他のヒント
以下のコードを試してください。
FileStream fileStr = File.Open(<full file name>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
fileStream = new StreamReader(fileStr);
Windows XPで試しました。ファイルが他のプロセスによって書き込みモードで既に開かれている場合&amp;共有権限が指定されていない場合でも、ファイルを読み取りモードで開くことができます。
免責事項:動作しますが、実稼働コードで使用すべきかどうかはわかりません。動作するはずの正式なドキュメントはまだ見つかりません。