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

时间:2009-02-02 09:14:52

标签: c# asp.net proxy

我正在尝试加入一些在下载过程中分割的二进制文件。该要求源于项目http://asproxy.sourceforge.net/。在此项目中,作者允许您通过提供URL来下载文件。

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

我目前通过读取所有文件然后将它们写入一个文件来加入文件。这应该可以工作,因为我正在以字节读写。我用来加入文件的代码列在这里http://www.geekpedia.com/tutorial201_Splitting-and-joining-files-using-C.html

我没有确切的代码与我一起,只要我在家,我会发布确切的代码,如果有人愿意帮助。

如果我错过了任何内容或者是否有更好的方法,请告诉我,即我可以使用什么作为内存流的替代方案。我可以在http://asproxy.sourceforge.net/download.html找到我所做的更改的原始项目的源代码,应该注意我使用的是5.0版本。我修改的文件名为WebDataCore.cs,我修改了第606行,直到加载了10兆的数据继续执行。

如果我错过了什么,请告诉我。

由于

3 个答案:

答案 0 :(得分:3)

你不应该因为内存原因而拆分......分裂的原因通常是为了避免在发生故障时重新下载所有内容。如果内存是一个问题,那你做错了......例如,你不应该在内存中缓冲。

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

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个字节,或者我们已经到达流的末尾)
  • 如果我们读了一些东西,就把这么多字节从缓冲区写到输出

答案 1 :(得分:2)

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

感谢所有帮助

答案 2 :(得分:1)

该示例将每个整个块加载到内存中,而您可以执行以下操作:

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