управляемый c ++ .NET извлекает файл из ресурса, неверный размер файла - PullRequest
1 голос
/ 24 июля 2011

Привет, я пытаюсь извлечь файл из моего встроенного ресурса, но проблема в том, что размер файла неправильный, он должен быть около 3500 КБ, но получается 5850 КБ или около того.

            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();

Это сделает правильный файл и правильный размер файла =)

1 Ответ

2 голосов
/ 24 июля 2011

Двоичные данные не являются текстовыми.

StreamReader конвертирует ваши данные в UTF8, а это не то, что вам нужно.
Вам необходимо скопировать необработанные байты, вызвав Write и Read.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...