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 ответа
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
}
Наверное, лучше реализовать это с использованием. Использование close и удаление базового потока за вас.
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;
}
}
}
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
//code here
}
Я думаю, что это было введено в NET 3.0 или около того, и вам больше не нужно закрывать потоки
Все, что находится внутри скобок, будет автоматически закрыто и утилизировано, когда код покинет эту часть.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.