2011-07-25 34 views
0

下载zip文件与webclient似乎不能正常工作,一旦下载并保存压缩文件出现无效或损坏,用zip压缩阅读器打开。然而,源zip文件似乎很好,它是一个有效的zip。c#WebClient下载zip破坏它

下载代码:

using (WebClient webClient = new WebClient()) 
     { 
      webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
      webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
      webClient.DownloadFileAsync(new Uri(URL), downloadZipFilename); 
     } 
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
    { 
     progressBar.Value = e.ProgressPercentage; 
    } 

    private void Completed(object sender, AsyncCompletedEventArgs e) 
    { 
     //unzip 
     using (ZipFile zipFile = ZipFile.Read(currentTemporaryDownloadFileUrl)) 
     { 
      zipFile.ExtractAll(currentTargetFileUrl); 
     } 
     File.Delete(currentTemporaryDownloadFileUrl); 
     DownloadFinished(this,EventArgs.Empty); 
     Console.WriteLine("File finished downloading."); 
    } 

拉链提取出来作为腐败。

Server代码:

//send file 
        e.Response.Connection.Type = HttpServer.Headers.ConnectionType.Close; 
        byte[] buffer = ReadFile(filePath); 
        e.Response.Body.Write(buffer, 0, buffer.Length); 

READFILE服务器上:

public static byte[] ReadFile(string filePath) 
     { 
      // this method is limited to 2^32 byte files (4.2 GB) 

      FileStream fs = File.OpenRead(filePath); 
      try 
      { 
       byte[] bytes = new byte[fs.Length]; 
       fs.Read(bytes, 0, Convert.ToInt32(fs.Length)); 
       fs.Close(); 
       return bytes; 
      } 
      finally 
      { 
       fs.Close(); 
      } 
     } 

这里有什么错?

感谢, 基督教斯图尔特

+0

您可能在'ReadFile'中耗尽内存。 –

+1

您是否将下载的文件与服务器上的文件进行了比较? –

+0

任何想法?任何人 –

回答

0

而不是低效地将ZIP文件加载到内存中,然后写出来,有关使用

e.Response.TransmitFile(filePath); 

的TransmitFile直接流至输出流没有缓冲,从而减少内存消耗如何。

+0

啊,我明白了,在服务器上流式传输文件。让我看看使用这个。 –

+0

嗨,我似乎无法弄清楚如何使用这个,因为响应变量没有TransmitFile可用。我使用HttpServer,它来自某个地方的类,我只是不记得在哪里:)感谢您的帮助 –

0

WebClient通话使用downloadZipFilename而INT的Completed方法使用currentTemporaryDownloadFileUrl ...会不会是该Completed方法试图解压缩其他一些文件,并下载一个?

您的服务器代码仅支持< = 2 GB(Int32是int的别名,已签名!)...是大于2 GB的文件吗? 如果文件较大,那么你的服务器代码发送“休息”(大于2 GB)的所有字节为0x00,这绝对会使ZIP损坏...

+0

嗨,它远小于2GB,只有几千字节的测试。这两个字符串应该是相同的,它们在代码的早期设置。 –

0

我建议你从客户端读取和解压缩服务器传输。这样你可以隔离出现的任何问题。

确保服务器“创建并传输zip文件”的东西正常工作。尝试从浏览器访问服务器,确保您可以成功解压zip文件。然后添加C#客户端,以编程方式下载并解压zip文件。

+0

我最终在这里做了什么(刚才意识到我从来没有接受过答案)是我打包每个文件,发送它,然后解压缩它 - 这里的问题是我将它保存在内存中。相反,我现在只需将文件下载到一个临时文件夹,然后从那里提取。 –