1

通常の I/O 用に開いているファイルを削除するには?

ファイルを復号化したい。コードが正しくない場合は、出力ファイルを削除する必要があります。

File.Delete()次の理由で使用できません。

Windows NT 4.0 プラットフォーム 注: 削除では、通常の I/O 用に開いているファイルやメモリ マップされているファイルは削除されません。

try
{
    FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read, FileShare.Delete);
    FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Delete);

    PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
    Rijndael alg = Rijndael.Create();

    alg.Key = pdb.GetBytes(32);
    alg.IV = pdb.GetBytes(16);

    CryptoStream cs = new CryptoStream(fsOut, alg.CreateDecryptor(), CryptoStreamMode.Write);

    int bufferLen = 4096;
    byte[] buffer = new byte[bufferLen];
    int bytesRead;

    do
    {
        bytesRead = fsIn.Read(buffer, 0, bufferLen);
        cs.Write(buffer, 0, bytesRead);
    } while (bytesRead != 0);

    cs.Close();
    fsIn.Close();
    return true;
}
catch(Exception)
{
    MessageBox.Show("Incorrect code :(");
    return false;
}

出力ファイルを削除する方法を知っている人はいますか?

4

1 に答える 1

5

答えはすでにあなたの質問にあります。

Delete は、通常の I/O 用に開いているファイルを削除しません。

そのため、ファイルを閉じてから削除できます。

また、ファイル ストリームをusingブロックでラップして、管理されていないリソースがタイムリーかつ予測可能な方法で整理されるようにする必要があります。このような:

using (FileStream fsIn = new FileStream(...))
{
    ....
}

これは、作業が終了したときにファイルを確実に閉じるための最良の方法です。ブロックFile.Deleteの後に呼び出しを入れることができます。using

最後に、あなたが を使いたくないと確信していますFileShare.Delete。たとえば、操作中に他のプロセスがファイルを削除できるようにする入力ファイル。FileShare.Read読み取り中FileShare.Noneのファイルと書き込み中のファイルが必要です。

于 2012-12-16T15:31:01.793 に答える