2011-07-24 37 views
1

嗨即時嘗試從我的嵌入式資源提取文件,但問題是文件大小不正確,它應該是大約3500KB,但它出來爲5850KB或所以。託管的c + +從資源提取文件,錯誤的文件大小

  Assembly ^myAssembly = Assembly::GetExecutingAssembly(); 
     Stream ^myStream = myAssembly->GetManifestResourceStream("cool.exe"); 
     FileStream^ fs = gcnew FileStream("cool.exe",FileMode::Append,FileAccess::Write,FileShare::Write); 
     StreamReader^ Reader = gcnew StreamReader(myStream); 
     StreamWriter^ Writer = gcnew StreamWriter(fs); 
     Writer->Write(Reader->ReadToEnd()); 
     fs->Close(); 

這是所編輯的一個:

Assembly ^myAssembly = Assembly::GetExecutingAssembly(); 
     Stream ^myStream = myAssembly->GetManifestResourceStream("cool.exe"); 
     FileStream^ fs = gcnew FileStream("cool.exe",FileMode::Append,FileAccess::Write,FileShare::Write); 
     StreamReader^ Reader = gcnew StreamReader(myStream); 
     StreamWriter^ Writer = gcnew StreamWriter(fs); 
     //Writer->Write(Reader->ReadToEnd()); 

     array<Byte^>^ buffer = gcnew array<Byte^>(256); 

     while (true) 
     { 

      int read = Reader->Read(buffer,0,buffer->Length); 
      if(read <= 0) 
      { 
       return; 
      } 
      Writer->Write(buffer,0,read); 
     } 

     fs->Close(); 

SOLOUTION

public: static void CopyStream(Stream^ input, Stream^ output) 
     {  

      array<Byte>^ buffer = gcnew array<Byte>(32768); 

      long TempPos = input->Position; 

      while (true)   
      {   
       int read = input->Read(buffer, 0, buffer->Length);   
       if (read <= 0) break;   
       output->Write (buffer, 0, read);  
      }  
      input->Position = TempPos;// or you make Position = 0 to set it at the start 
     } 

然後使用它:

Assembly ^myAssembly = Assembly::GetExecutingAssembly(); 
     Stream ^myStream = myAssembly->GetManifestResourceStream("cool.exe"); 
     FileStream^ fs = gcnew FileStream("cool.exe",FileMode::Append,FileAccess::Write,FileShare::Write); 

     CopyStream(myStream,fs); 
     fs->Close(); 

這將使正確的文件和正確的文件大小=)

+0

順便說一句,如果你使用.Net 4.0,你可以調用'Stream.CopyTo'。 – SLaks

回答

2

二進制數據不是文本。

StreamReader正在將您的數據轉換爲UTF8,這不是您想要的。
您需要通過調用WriteRead來複制原始字節。

+0

你能把我鏈接到一些文檔嗎?我需要使用BinaryWriter嗎? – cccru

+0

否。只需調用Read()直到它讀取「0」和Write()'您讀取的每個塊。 http://www.google.com/search?q=.net+copy+stream&ie=UTF-8 – SLaks

+0

好吧,我編輯了我的帖子,我是朝着正確的方向走? 我得到1錯誤: 錯誤錯誤C2664:'void System :: IO :: TextWriter :: Write(cli :: array ^,int,int)':無法轉換參數1從'cli :: array ^'到'cli :: array ^' – cccru