0

我想使用 wget 在 3 个不同的位置下载多个文件,例如 www.google.com、yahoo.com 和 gmail.com。我该怎么做?请帮帮我。。

我正在通过 c# 完成所有这些工作:

        ProcessStartInfo startInfo = new ProcessStartInfo("CMD.exe");
        Process p = new Process();
        startInfo.RedirectStandardInput = true;
        startInfo.UseShellExecute = false;
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;
        p = Process.Start(startInfo);

        p.StandardInput.WriteLine(@"wget --output-document=C:\1.xml xyz.com/a.xml");
        p.StandardInput.WriteLine(@"wget --output-document=C:\2.xml xyz.com/b.xml");
        p.StandardInput.WriteLine(@"wget --output-document=C:\3.xml xyz.com/c.xml");

        p.StandardInput.WriteLine(@"EXIT");
        string output = p.StandardOutput.ReadToEnd();
        string error = p.StandardError.ReadToEnd();
        p.WaitForExit();
        p.Close();

这是行不通的。想知道是否有任何其他使用 wget 下载多个文件的方法。

4

2 回答 2

2

如果您只是在谈论从不同位置检索每个文件,但仍按顺序执行,则只需更改wget命令中的 URI 以指向不同位置。

如果您想要并发下载而不是顺序下载,则必须启动三个单独的进程并让它们分别下载一个文件。这些 ptocesses 可以并行运行,但我可能只考虑大文件(其中 XML 文件可能不是)。

如果您根本无法运行命令,我要做的第一件事就是放弃cmd.exe它的标准输入。没有理由不能wget直接运行进程。或者,如果您真的只想启动一个进程,您可以将它们输出到一个临时文件并使用单个进程cmd /c tempfile.cmd来运行它。


但是,您可能遇到与您所展示的内容无关的完全不同echo的问题,因为用三个语句代替您wget的语句的确切代码运行良好,生成正确的输出,至少在 Visual C# Express 2010 中。

而且,事实上,一旦我将 GnuWin32wget安装到路径上,以下操作也同样有效,从网上获取真实文档并将它们放在我的顶级目录中:

using System;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe");
            Process p = new Process();
            startInfo.RedirectStandardInput = true;
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            p = Process.Start(startInfo);

            p.StandardInput.WriteLine(
                @"wget --output-document=c:\q1.txt http://www.ibm.com");
            p.StandardInput.WriteLine(
                @"wget --output-document=c:\q2.txt http://www.microsoft.com");
            p.StandardInput.WriteLine(
                @"wget --output-document=c:\q3.txt http://www.borland.com");

            p.StandardInput.WriteLine(@"exit");

            string output = p.StandardOutput.ReadToEnd();
            string error = p.StandardError.ReadToEnd();
            p.WaitForExit();
            p.Close();
        }
    }
}

这是证明,微软下载过程中的单个窗口:

在此处输入图像描述

因此,最重要的是,您向我们展示的内容并非天生不可行,如上图所示。我唯一的建议是开始查看其他内容,例如wget您正在使用的版本、GnuWin32 或 CygWin。


现在,正如您在其中一条评论中所述,更大的文件会变得有趣。如果我将所有三个 URI 都更改http://download.microsoft.com/download/5/F/C/5FC4F80C-242D-423B-9A11-9510A013152D/Dolphins.themepack为 12,889,103 字节的文件,则上面的代码在第一次下载的大约 18% 处挂起(大约 2.3M 标记)。

但是,如果我更改命令以使其>nul: 2>nul:最终具有,则下载将毫无问题地进行,因此我怀疑这很可能是wget其输出写入方式的问题(没有换行符)。如果您不对输出和错误流使用重定向,它也可以完全工作,这会加强该断言。

于 2013-05-09T06:08:13.793 回答
0

嗯,首先,你在 Windows 上。wget 是 GNU 操作系统的一部分。除非您为 Windows 安装了 wget 的“克隆”,否则这是不可能的。您最好自己下载页面,例如HTTPClient 类

但是,如果您安装了某种形式的 wget,什么不起作用?你希望它如何工作?您的问题不是很详细,您只是问如何去做,并提供一个看似不错的解决方案。

于 2013-05-09T06:12:09.570 回答