如何删除为普通I / O打开的文件?

时间:2012-12-16 15:28:14

标签: c# stream

如何删除为普通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;
}

有人知道如何删除输出文件吗?

1 个答案:

答案 0 :(得分:5)

答案已经在你的问题中了。

  

删除不会删除为正常I / O打开的文件。

因此,请关闭该文件,然后将其删除。

您还应该将文件流包装在using块中,以确保以及时和可预测的方式整理非托管资源。像这样:

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

这是确保文件完成后关闭的最佳方法。您可以在File.Delete阻止后将您的来电置于using

最后,我很确定你不想使用FileShare.Delete。例如,在您的输入文件上,允许其他进程在您对其进行操作时删除该文件。您希望在正在阅读的文件上使用FileShare.Read,并在您正在编写的文件上使用FileShare.None