2016-05-25 7 views
0
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; 
     } 
    } 

このコードでは、ストリームが正しく閉じられないという問題があります。 値を返す前に閉じるとエラーになります。使用してブラケットの内側もはやストリームを返すときにストリームを閉じる方法

ストリームを閉じる必要があり、私はそれがNET 3.0またはので、中に導入されたと思うし、あなたはドント
+0

ファイルを読み込んだ後、ストリームが開いているため、ファイルを読み取ると置き換えられません。 –

+0

返す前にfsCryptを閉じる必要があります – Akanksha

+0

私がそれを閉じる前に閉じるとテーブル0が見つかりません。 –

答えて

3

fsCrypt.Close();を実行する必要がありますが、関数の呼び出し元がStreamを使用できる必要があるため、sr.Close();は実行しないでください。エラーが発生したとき

また、順番に適切に近い流れで、使い捨てのコンテキストを使用します。

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 
} 
+0

"使い捨てコンテキスト"のようなものを言うなら、高級言語の新しいプログラマは実際に何が起こっているのか、なぜ彼らがスタックとヒープはもう です。あなたがフィールドに数年を持つ前に、最も簡単なコンセプトではありません –

+0

呼び出し元の部分が私のために働いています...ありがとう –

+0

上記のように解読関数を閉じるともう一つの問題が表示されますクローズドファイル。 –

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

//code here 
} 

すべてが自動的に閉じられますし、時にコードの葉を配置することその部分の

1

そのpropablyはるかに良い、それを実現するために使用して。使用を終了し、基になるストリームを処理します。

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; 
     } 
    } 
} 
関連する問題