2

読み取り専用かどうかを確認してから、try-catchステートメントを実行して読み取り可能かどうかを確認できますが、ファイルがすでに使用されているかどうかを確認する組み込みの方法はありますか?

4

2 に答える 2

7

FileSystemInfo.Attributesプロパティを使用して、以下を確認しFileAttributes.ReadOnlyます。

var file = new FileInfo(path);
if ((file.Attributes & FileAttributes.ReadOnly) != 0)
{
    // Do whatever you want for a read-only file
}

これは、ファイルに書き込めるかどうかと同じではないことに注意してください。すでに使用されている場合は、書き込みができない可能性があります。プロパティを呼び出したときに書き込み可能かどうか示されていても、直後にファイルに書き込めるかどうかはわかりません。

基本的に、失敗する可能性のあるファイルへの書き込みの試行を処理する場合は、try/catchを使用する必要がありますただし、すべての例外をIOExceptionキャッチするのではなく、具体的に(または、場合によってはさらに具体的な例外を)キャッチします。

于 2013-01-01T20:12:00.667 に答える
2

FileShare.Noneファイルを開くときに使用します。他のプロセスにファイルへのハンドルがある場合、呼び出しは失敗します。

例:ファイルが書き込み可能で使用されていないことを確認します。

bool isWritableAndFree = false;
try {
    using (new FileStream(name, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
    {
        isWritableAndFree = true;
    }
} catch { }
return isWritableAndFree;

ただし、このタイプのコードはTOCTOUのバグに対して脆弱であることに注意してください。多くの場合、使用時に例外をキャッチする方が適切です。

于 2013-01-01T20:12:47.203 に答える