2010-12-22 92 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。如果解密文件特别大,这可能很重要。

相关问题