如何在返回流时关闭流

时间:2016-05-25 05:22:43

标签: c# filestream

 public Stream DecryptFile(string inputFile)//, string outputFile)
    {
        {  
                string password = @"mykey"; // Your Key Here

                UnicodeEncoding UE = new UnicodeEncoding();
                byte[] key = UE.GetBytes(password);

                FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);

                RijndaelManaged RMCrypto = new RijndaelManaged();

                CryptoStream cs = new CryptoStream(fsCrypt,
                    RMCrypto.CreateDecryptor(key, key),
                    CryptoStreamMode.Read);


                StreamReader sr = new StreamReader(cs);



              Stream s = sr.BaseStream;
                //sr.Close();
                //fsCrypt.Close();
             return s;
        }
    }

在此代码中,存在流未正确关闭的问题。 如果我在返回值之前将其关闭,则会抛出错误。

3 个答案:

答案 0 :(得分:3)

应该执行

fsCrypt.Close();,但不应执行sr.Close();,因为您的函数的调用者应该能够使用Stream。

此外,为了在发生错误时正确关闭流,请使用一次性上下文:

using (FileStream fsCrypt = new FileStream(inputFile, FileMode.Open))
{
    RijndaelManaged RMCrypto = new RijndaelManaged();

    CryptoStream cs = new CryptoStream(fsCrypt,
        RMCrypto.CreateDecryptor(key, key),
        CryptoStreamMode.Read);

    StreamReader sr = new StreamReader(cs);
    Stream s = sr.BaseStream;
    return s;
}

来电者也应该使用这种模式:

using (var stream = DecryptFile(string inputFile))
{
    // do something with decrypted file
}

答案 1 :(得分:1)

using (FileStream fs = new FileStream(filePath, FileMode.Open,     FileAccess.Read, FileShare.ReadWrite))
{

//code here
}

我认为它是在.NET 3.0中引入的,您不再需要关闭流

使用括号内的所有内容都将自动关闭,并在代码离开该部分时被处置

答案 2 :(得分:1)

使用它可以更好地实现它。使用关闭并为您处理基础流。

public Stream DecryptFile(string inputFile)//, string outputFile)
{
    string password = @"mykey"; // Your Key Here
    UnicodeEncoding UE = new UnicodeEncoding();
    byte[] key = UE.GetBytes(password);
    using(var fsCrypt = new FileStream(inputFile, FileMode.Open)
    {
        RijndaelManaged RMCrypto = new RijndaelManaged();
        using(CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Read))
        {
            StreamReader sr = new StreamReader(cs);
            Stream s = sr.BaseStream;
            return s;
        }
    }
}