3

そのファイルのコピーを防ぐために、特定のファイルが開いているかどうかを確認する必要があります。

多くの例を試してみましたが、どれもうまくいきません! たとえば、これを試します:

protected virtual bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        //the file is unavailable because it is:
        //still being written to
        //or being processed by another thread
        //or does not exist (has already been processed)
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    //file is not locked
    return false;
}

オリエンテーションが必要です...どこで失敗しますか? 提案?

4

2 に答える 2

2

セキュリティの脆弱性として使用されている例が文書化されているため、スレッドの競合状態が発生する可能性があります。ファイルが利用可能であることを確認してから使用しようとすると、その時点でスローされる可能性があり、悪意のあるユーザーがコードを強制して悪用するために使用する可能性があります。

あなたの最善の策は、ファイルハンドルを取得しようとする try catch / finally です。

try
{
   using (Stream stream = new FileStream("MyFilename.txt", FileMode.Open))
   {
        // File/Stream manipulating code here
   }
} catch {
  //check here why it failed and ask user to retry if the file is in use.
}

また

この別のオプションを参照してください

https://stackoverflow.com/a/11060322/2218635

于 2013-04-01T18:25:46.137 に答える
2

アプリケーションが既にファイルを開いているかどうかを知りたい場合は、フィールドに保存し、ストリームを閉じるときにFileStreamフィールドをリセットする必要があります。null次に、ファイルの を簡単にテストして取得できFileStreamます。

別のアプリケーションが既にファイルを開いているかどうかを知りたい場合、できることはあまりありません。ファイルを開こうとすると、例外が発生する場合があります。しかし、知っていたとしても、ファイルへの参照やアプリケーション内の参照がないため、そのファイルのコピーを防ぐことはFileStreamできません。

于 2013-04-01T18:19:43.963 に答える