2017-09-07 14 views
2

このライン:ファイルストリームを読み込みできませんが、ファイルをコピーできますか?

using (FileStream fs = File.Open(src, FileMode.Open, FileAccess.Read, FileShare.Read)) 

スロー:

System.IO.IOException:プロセスが別のプロセスによって使用されて ため、ファイルを 'X' にアクセスできません。

私はと行置き換える:それが動作

File.Copy(src, dst, true); 
using (FileStream fs = File.Open(dst, FileMode.Open, FileAccess.Read, FileShare.Read)) 

を。

しかし、ファイルを直接読み取ることができない間に、ファイルの全内容を確実に読み取るのはなぜコピーできるのですか?回避策はありますか?

+3

'FileShareを使用するとどうなりますか?ReadWrite'?別のプロセスが書き込みアクセス権を開いている場合、共有読み取りアクセスのみを許可すると要求は失敗します。 –

+0

@SamKuhmonenはい!しかし、なぜ?ああ、私は参照してください... –

+0

この質問の重複がない場合、それを削除しないでください。これは有効な質問です。 –

答えて

5

ファイルを開くと、アクセスモードと共有モードがチェックされます。プロセスのアクセスモードは、他のプロセスの共有モードと互換性がなければなりません。したがって、Aが読み込みアクセスを望む場合、他の人は共有モードで読み込みを許可していなければなりません。書いても同じです。

プロセスAが書き込みのためのファイルを開いていて、SharingMode.Readと言うと、呼び出しは失敗します。この場合、「他人はファイルからのみ読み込み、書き込みはできません」と言っています。

ShareMode.ReadWriteを指定すると、「他人が読み書きできる、私は気にしません」と言われています。他のプロセスが指定されていない場合は、ShareMode.Writeを読むことができます。

1

しかし、なぜ、私はコピーすることができ、確実にファイル

の全体の内容を読み取り、それがストリームをコピーするよりも低いレベルで起こることができますがまあ、概念的には、ファイル全体を読み込みます。 Windowsでは、システム関数CopyFileExを呼び出し、パスを渡します。 * nixシステムではシステムコールも使用されますが、その呼び出しのソースファイルはFileAccess.Read, FileShare.Readで開きますので、同じ問題が発生します。

ファイルを直接読み取ることが制限されていますか?

ファイルは、ファイルを実行しているさまざまな操作の間にいくつかの点で変更することができ、あなたの操作が間違った結果が得られますので、あなたはそれFileShare.Readを開くことができないに書き込むことができる場合。

CopyFileExは、結果に影響を与えていない短期間に発生した書き込みを防止することによって、成功することができます。より一般的な形式を提供する方法はありません。なぜなら、あなたがすぐにそのストリームを閉じるつもりであることを知る方法がないからです。

回避策はありますか?

何のための回避策ですか?ストリームを開くことができない、またはファイルをコピーできますか?前者の場合、後者はただの回避策を提供します。ファイルをコピーして、元の状態のスナップショットを取得しますが、保証されていないことに注意してください。

+0

説明のおかげで、私は 'FileShare.ReadWrite'に' FileShare.ReadWrite'を間違えてしまったので、私の問題を解決しました。 –

関連する問題