(ローカル ネットワーク ドライブ上の) ファイルが既に使用されているかどうかを、.Net で開く前に確認する方法はありますか?
6 に答える
アクセスを試みて失敗した場合は、必要なアクセス許可がないか (GetAccessControl で確認できます)、別のプロセスによってロックされています。
しかし、ロックと許可の失敗を区別するための信頼できる手段はないと思います (ファイルを読み取ることはできても、許可を確認することはできないため)。Windows のエラー メッセージでさえ、権限がないか、別のプロセスで使用されていると表示されます。
WMICIM_DataFile
クラスを使用InUseCount
して、指定したデータ ファイルを照会できます。
lsof
Linux のユーティリティに相当するプログラムを探している場合、特定のローカルプロセスによって開いているすべてのファイルを見つけるには、名前空間Win32_Process
を介して WMI クラスを使用してみてください。System.Management
WMI クエリを発行して、すべてのローカル プロセスで使用されているすべての開いているファイルのファイル名を検索し、そこにあるかどうかを確認することができます。または、P/Invoke を使用NtQuerySystemInformation
して直接 API を使用し、同じタスクを実行することもできます。
これで十分です。MSDN に記載されている FileShare.None :
なし : 現在のファイルの共有を拒否します。(このプロセスまたは別のプロセスによる) ファイルを開く要求は、ファイルが閉じられるまで失敗します。
File.Open(name, FileMode.Open, FileAccess.Read, FileShare.None);
編集 : Try/Catch ブロックでラップすることを忘れないでください。FileShare.None を使用すると、実際にはファイルを排他的に開きたいということになります。
bool CanReadAndWrite(string path)
{
var perm = new System.Security.Permissions.FileIOPermission(
System.Security.Permissions.FileIOPermissionAccess.Write |
System.Security.Permissions.FileIOPermissionAccess.Read,
path);
try
{
perm.Demand();
return true;
}
catch
{
return false;
}
}
ファイルの読み書きができるかどうかを確認します。
System.IO.File.OpenWrite(パス) を使用します。これを try/catch ブロックで囲みます。別の場所で書き込み用に既に開いている場合は、System.UnauthorizedAccessException が発生します。
一般に、ファイルのアクセシビリティチェックに依存することは常に避けてください。その理由は、そうなる可能性があり、アクセスする前に数サイクルだけ変更される可能性があるためです。
代わりに、それを開いて、エラーがないかどうかを確認してください。
次の構文が役に立ちます。
FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);