加入已通过下载分割的二进制文件

加入已通过下载分割的二进制文件

问题描述:

我想加入一些在下载过程中分割的二进制文件。该要求源于项目http://asproxy.sourceforge.net/。在这个项目中,作者允许你通过提供一个url来下载文件。加入已通过下载分割的二进制文件

问题出在我的服务器没有足够内存来保存大于20兆内存的文件。所以为了解决这个问题,我修改了代码,不下载大于10兆的文件,如果文件是更大的,它会允许用户下载前10个兆字节。然后用户必须继续下载,并希望获得第二个10兆。现在我已经得到了所有这些工作,除非用户需要加入他们下载的文件时,我最终会得到损坏的文件,只要我可以通过下载来添加或删除某些内容。

我目前通过阅读所有的文件,然后将它们写入一个文件,一起加入文件。这应该工作,因为我正在读取和写入字节。我用来加入文件的代码在这里列出​​

我没有确切的代码与我atm,只要我在家我会发布确切的代码,如果任何人愿意帮忙。

请让我知道,如果我错过任何东西或者有更好的方法来做到这一点,即我可以用什么作为内存流的替代方案。我修改的原始项目的源代码可以在这里找到http://asproxy.sourceforge.net/download.html,应该指出我使用的是5.0版本。我修改的文件名为WebDataCore.cs,我修改了第606行,直到10兆数据被载入继续执行。

让我知道是否有任何我错过了。

感谢

最后,我发现通过使用FTP请求,我能够解决内存问题,并且文件被正确保存。

感谢所有帮助

你不应该分裂的记忆原因...分裂的原因通常是为了避免重新下载失败的情况下一切。如果内存是一个问题,你就错了......例如,你不应该在内存中缓冲。

下载文件的最简单方法就是:

using(WebClient client = new WebClient()) { 
    client.DownloadFile(remoteUrl, localPath); 
} 

重新将拆分/加入代码 - 再次,问题是,你是缓冲内存中的所有; File.ReadAllBytes是一件坏事,除非你知道你有小文件。你应该有什么类似的:

byte[] buffer = new byte[8192]; // why not... 
int read; 
while((read = inStream.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    outStream.Write(buffer, 0, read); 
} 

这使用一个温和的缓冲区来作为一个流的两个泵之间的数据。效率更高。循环说:

  • 尝试读一些数据(最多,缓冲区大小)
  • (这将至少读1个字节,或者我们已经到达流的末尾)
  • 如果我们读到的东西,写从缓冲区这么多字节输出
+0

谢谢,伙计,你的代码看起来很完美,除了我不知道如何将我落实到项目这是在流并在数据被写入了是对另一端的地方项目。我可以多求一点帮助吗? – RC1140 2009-02-02 12:09:33

+0

有什么具体问题吗? – 2009-02-02 12:54:18

这个例子是加载每个整个块到内存中,而不是你可以做这样的事情:

int bufSize = 1024 * 32; 
byte[] buffer = new byte[bufSize]; 

using (FileStream outputFile = new FileStream(OutputFileName, FileMode.OpenOrCreate, 
FileAccess.Write, FileShare.None, bufSize)) 
{ 
    foreach (string inputFileName in inputFiles) 
    { 
     using (FileStream inputFile = new FileStream(inputFileName, FileMode.Append, 
      FileAccess.Write, FileShare.None, buffer.Length)) 
    { 
    int bytesRead = 0; 

    while ((bytesRead = inputFile.Read(buffer, 0, buffer.Length)) != 0) 
    { 
     outputFile.Write(buffer, 0, bytesRead); 
    } 
}