2010-12-22 71 views
2

我的代碼功能如何創建FileStream但不保存?

public static void DecryptFile(string inFile, string outFile, string password) 
{ 
    // create and open the file streams 
    using (FileStream fin = File.OpenRead(inFile), 
       fout = File.OpenWrite(outFile)) 
    { 
     int size = (int)fin.Length; // the size of the file for progress notification 
     byte[] bytes = new byte[BUFFER_SIZE]; // byte buffer 
     int read = -1; // the amount of bytes read from the stream 
     int value = 0; 
     int outValue = 0; // the amount of bytes written out 

     // read off the IV and Salt 
     byte[] IV = new byte[16]; 
     fin.Read(IV, 0, 16); 
     byte[] salt = new byte[16]; 
     fin.Read(salt, 0, 16); 

     // create the crypting stream 
     SymmetricAlgorithm sma = CryptoHelp.CreateRijndael(password, salt); 
     sma.IV = IV; 

     value = 32; // the value for the progress 
     long lSize = -1; // the size stored in the input stream 

     // create the hashing object, so that we can verify the file 
     HashAlgorithm hasher = SHA256.Create(); 

     // create the cryptostreams that will process the file 
     using (CryptoStream cin = new CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read), 
        chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write)) 
     { 
      // read size from file 
      BinaryReader br = new BinaryReader(cin); 
      lSize = br.ReadInt64(); 
      ulong tag = br.ReadUInt64(); 

      if (FC_TAG != tag) 
       throw new CryptoHelpException("File Corrupted!"); 

      //determine number of reads to process on the file 
      long numReads = lSize/BUFFER_SIZE; 

      // determine what is left of the file, after numReads 
      long slack = (long)lSize % BUFFER_SIZE; 

      // read the buffer_sized chunks 
      for (int i = 0; i < numReads; ++i) 
      { 
       read = cin.Read(bytes, 0, bytes.Length); 
       fout.Write(bytes, 0, read); 
       chash.Write(bytes, 0, read); 
       value += read; 
       outValue += read; 
      } 

      // now read the slack 
      if (slack > 0) 
      { 
       read = cin.Read(bytes, 0, (int)slack); 
       fout.Write(bytes, 0, read); 
       chash.Write(bytes, 0, read); 
       value += read; 
       outValue += read; 
      } 
      // flush and close the hashing stream 
      chash.Flush(); 
      chash.Close(); 

      // flush and close the output file 
      fout.Flush(); 
      fout.Close(); 

      // read the current hash value 
      byte[] curHash = hasher.Hash; 

      // get and compare the current and old hash values 
      byte[] oldHash = new byte[hasher.HashSize/8]; 
      read = cin.Read(oldHash, 0, oldHash.Length); 
      if ((oldHash.Length != read) || (!CheckByteArrays(oldHash, curHash))) 
       throw new CryptoHelpException("File Corrupted!"); 
     } 

     // make sure the written and stored size are equal 
     if (outValue != lSize) 
      throw new CryptoHelpException("File Sizes don't match!"); 
    } 
} 

我需要返回的FileStream(FOUT)和FOUT不保存到硬盤

UPDATE:

YES,MemoryStream的還是不錯的。但隨後我將需要使用FileStream否則會出現錯誤:

不起作用:

using (ZipInputStream s = new ZipInputStream(fout)) 
{ 

    ZipEntry theEntry; 
    while ((theEntry = s.GetNextEntry()) != null)//exception 

是工作:

using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFile))) 
{ 

    ZipEntry theEntry; 
    while ((theEntry = s.GetNextEntry()) != null) 

我需要解密的文件,將它解壓縮之後,還無需保存即可獲取文本

+0

如果你不想把它保存到磁盤上,你爲什麼要創建一個`FileStream`? `FileStream`是磁盤文件的流視圖。你是否想要其他類型的流?也許`MemoryStream`就是你要找的東西? – 2010-12-22 19:33:39

+0

@ Jim Mischel,但是......我編輯帖子。 – Mediator 2010-12-22 19:52:00

+0

當不使用`FileStream`時會得到什麼異常? – Oded 2010-12-22 20:00:20

回答

9

請勿使用第二個FileStream。您可以改用MemoryStream

using (FileStream fin = File.OpenRead(inFile)) 
    using(Stream fout = new MemoryStream()) 
... 
3

我建議改變你的方法簽名:

public static void DecryptFile(string inFile, string password, Stream outStream) 

public static void DecryptFile(string inFile, string password, string outFile) 

(第2可以很容易地通過打電話是先用FileStream參數來實現)。

這留下了與調用者創建Stream的責任,這與Oded的解決方案相比具有優勢,它不必將整個輸出存儲在內存中;用戶可以選擇提供消耗輸出的Stream。如果解密文件特別大,這可能很重要。

相關問題