2

(ローカル ネットワーク ドライブ上の) ファイルが既に使用されているかどうかを、.Net で開く前に確認する方法はありますか?

4

6 に答える 6

3

アクセスを試みて失敗した場合は、必要なアクセス許可がないか (GetAccessControl で確認できます)、別のプロセスによってロックされています。

しかし、ロックと許可の失敗を区別するための信頼できる手段はないと思います (ファイルを読み取ることはできても、許可を確認することはできないため)。Windows のエラー メッセージでさえ、権限がないか、別のプロセスで使用されていると表示されます。

WMICIM_DataFileクラスを使用InUseCountして、指定したデータ ファイルを照会できます。

lsofLinux のユーティリティに相当するプログラムを探している場合、特定のローカルプロセスによって開いているすべてのファイルを見つけるには、名前空間Win32_Processを介して WMI クラスを使用してみてください。System.ManagementWMI クエリを発行して、すべてのローカル プロセスで使用されているすべての開いているファイルのファイル名を検索し、そこにあるかどうかを確認することができます。または、P/Invoke を使用NtQuerySystemInformationして直接 API を使用し、同じタスクを実行することもできます。

于 2008-12-17T10:22:57.480 に答える
2

これで十分です。MSDN に記載されている FileShare.None :

なし : 現在のファイルの共有を拒否します。(このプロセスまたは別のプロセスによる) ファイルを開く要求は、ファイルが閉じられるまで失敗します。

File.Open(name, FileMode.Open, FileAccess.Read, FileShare.None);

編集 : Try/Catch ブロックでラップすることを忘れないでください。FileShare.None を使用すると、実際にはファイルを排他的に開きたいということになります。

于 2008-12-17T11:33:38.023 に答える
2
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;
    }
}

ファイルの読み書きができるかどうかを確認します。

于 2008-12-17T11:34:39.847 に答える
1

System.IO.File.OpenWrite(パス) を使用します。これを try/catch ブロックで囲みます。別の場所で書き込み用に既に開いている場合は、System.UnauthorizedAccessException が発生します。

于 2008-12-17T10:25:02.017 に答える
0

一般に、ファイルのアクセシビリティチェックに依存することは常に避けてください。その理由は、そうなる可能性があり、アクセスする前に数サイクルだけ変更される可能性があるためです。

代わりに、それを開いて、エラーがないかどうかを確認してください。

于 2008-12-17T12:18:58.370 に答える
0

次の構文が役に立ちます。

FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);

于 2008-12-17T10:32:59.380 に答える