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
Anoop Mishra 25 Май 2016 в 08:22

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
}
3
Alexei 25 Май 2016 в 05:32

Наверное, лучше реализовать это с использованием. Использование 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;
        }
    }
}
1
Marius 25 Май 2016 в 05:32
using (FileStream fs = new FileStream(filePath, FileMode.Open,     FileAccess.Read, FileShare.ReadWrite))
{

//code here
}

Я думаю, что это было введено в NET 3.0 или около того, и вам больше не нужно закрывать потоки

Все, что находится внутри скобок, будет автоматически закрыто и утилизировано, когда код покинет эту часть.

1
Mikael Puusaari 25 Май 2016 в 05:29