嗨即時嘗試從我的嵌入式資源提取文件,但問題是文件大小不正確,它應該是大約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();
這將使正確的文件和正確的文件大小=)
順便說一句,如果你使用.Net 4.0,你可以調用'Stream.CopyTo'。 – SLaks