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;
}
}
在此代码中,存在流未正确关闭的问题。 如果我在返回值之前将其关闭,则会抛出错误。
答案 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;
}
}
}