14

StreamReader を使用してファイルを読み取ろうとしていますが、常に別のプロセスで使用されているため、次のエラーが発生します。

別のプロセスで使用されているため、プロセスはファイル '\arfjwknasgmed17\C$\FLAG CONDITION\CP-ARFJN-FLAG.XLS' にアクセスできません。

これをコピーせずに読む方法はありますか?それともそれが私の唯一の選択肢ですか?

4

2 に答える 2

25

ファイルを最初に開いたプログラムがそのファイルに対する読み取り共有権限を指定した場合にのみ、ファイルを読み取ることができます。

ただし、ファイルに実際に読み取り共有権限がない場合は、そもそもコピーできません。

既にファイルを開いているプログラムの共有権と競合する共有権を指定すると、ファイルにアクセスできない場合があります。たとえば、既に開いているプログラムが書き込みアクセスを許可していない場合、書き込みアクセスを許可することはできません。

最初にファイルを開いたプログラムがボリューム シャドウ コピー (VSS) をサポートしている場合は、VSS を使用してファイルにアクセスすることもできます。

使用中であっても、そのようなファイルにアクセスできる商用ソフトウェア ドライバーがあります。以前は、St-Bernards の Open File Manager を入手できました。また、VisionWorks Solutions Inc. のFile Access Manager (FAM)も使用できます。これらのドライバーは、通常、製品に含めるソフトウェア会社をバックアップするために OEM 化されています。

VSS は、ファイルを既に開いているプログラムに、別のプログラムがファイルから読み取りたいことを伝えることによって機能します。次に、VSS はファイルのコピーを作成し、このコピーから読み取れるようにします。VSS はレガシー アプリケーションでは機能しません。

FAM は、排他的に開いてロックされたファイルにアクセスできるアプリケーションの「許可リスト」を指定することにより、レガシー プログラムと非レガシー プログラムに対して同様に透過的に機能します。このリストにあるプログラムだけが、これらのファイルへのアクセスを許可されています。ファイルが開かれると、ファイルはキャッシュ モードになり、ファイルの「バックアップ/オープン」が開始されたときのファイルのコピーが取得されます。この時点で、最初にファイルを開いたプログラムはファイルを実際の状態で認識し、許可リストの 2 番目のプログラムは、ファイルの「オープン/バックアップ」が発生したときの状態でファイルを認識します。これにより、ファイルの一貫性が保証されます。

于 2008-10-15T06:06:41.907 に答える
2

以下のコードを試してください。

FileStream fileStr = File.Open(<full file name>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
fileStream = new StreamReader(fileStr);

WindowsXPで試してみました。ファイルが他のプロセスによって書き込みモードで既に開かれていて、共有権限が指定されていない場合でも、ファイルを読み取りモードで開くことができます。

免責事項:それは機能しますが、それでは、本番コードで使用する必要があるかどうかはわかりません。動作するはずだという正式なドキュメントはまだ見つかりません。

于 2012-02-03T04:57:49.783 に答える