2015-06-11 34 views
0

我发现这个代码片断下载文件下载二进制文件:如何使用wxWidgets

wxURL url(wxT("http://www.example.com/file.txt")); 
if(url.GetError()==wxURL_NOERR) 
{ 
    wxString htmldata; 
    wxInputStream *in = url.GetInputStream(); 

    if(in && in->IsOk()) 
    { 
     wxStringOutputStream html_stream(&htmldata); 
     in->Read(html_stream); 
     wxLogMessage(htmldata); 
    } 
    delete in; 
} 

但fistly它只是记录文件的内容,并只对文本文件。但是我需要下载* .exe文件以后再执行它。所以我需要修改这些代码来处理二进制数据,并将这些数据保存到磁盘上。这里使用了太多的Streams来理解这里发生的事情。请帮忙。

+0

您是否尝试使用[wxFileOutputStream](http://docs.wxwidgets.org/trunk/classwx_file_output_stream.html)而不是字符串输出? – Bastien

+0

是的,文件被下载,但不可执行win32应用 – Neka

+1

通过网络读取文件是相同的,不管它是什么类型的文件,数据就是数据。最大的区别在于你如何处理接收方的数据,例如你不能使用例如'wxStringOutputStream'或将数据记录为文本,除非数据实际上*为*文本。我对WX网络类没有任何了解,但是如果您在线查找手册页,我相信您可以找到一个处理任意数据的流类,那么这只是将它写入磁盘而不是记录数据,这里的重要部分是以二进制模式打开文件。 –

回答

0

我以前写过以下代码... 这可以很好地在任何平台下载二进制文件。

/** START */ 
// ex) ht tp://mysite.com/mypath.jpg 
wxString path = wxT("/mypath.jpg"); 
wxString server = wxT("mysite.com"); 

wxHTTP http; 
http.SetHeader(_T("Content-type"), contentType); 
http.SetTimeout(10); 

// wxString imageFilePath = wxT("/tmp/image.jpg"); 
wxFileOutputStream output(imageFilePath); 
wxDataOutputStream store(output); 

if (http.Connect(server, 80)) 
{ 
    wxInputStream *stream; 
    stream = http.GetInputStream(path); 

    if (stream == NULL) 
    { 
     output.Close(); 
    } 
    else 
    { 
     unsigned char buffer[1024]; 
     int byteRead; 

     // receive stream 
     while (!stream->Eof()) 
     { 
     stream->Read(buffer, sizeof(buffer)); 
     store.Write8(buffer, sizeof(buffer)); 
     byteRead = stream->LastRead(); 
     if (byteRead <= 0) 
     { 
     break; 
     } 
     } 

     output.Close(); 
    } 
} 
else 
{ 
    output.Close(); 
} 
相关问题