使用wget命令下载不同位置的多个文件

时间:2013-05-09 06:05:33

标签: c# download wget

我想使用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下载多个文件的方法..

2 个答案:

答案 0 :(得分:2)

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

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

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


但是,可能存在一个完全不同的问题,与您展示的内容无关,因为具有三个echo语句的确切代码代替了您的{{1运行正常,生成正确的输出,至少在Visual C#Express 2010中。

事实上,一旦我将GnuWin32 wget放到路径上,以下工作也可以,从网上获取真实文档并将它们放在我的顶级目录中:

wget

这是证明,微软下载的单一窗口:

enter image description here

所以,最重要的是,你向我们展示的内容本身并不是不可行的,如上图所示。我唯一的建议是开始考虑其他事情,例如你正在使用的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(); } } } 版本,GnuWin32或CygWin。


现在,正如您在其中一条评论中所说的那样,对于较大的文件,事情会变得有趣。如果我将所有三个URI更改为wget,一个12,889,103字节的文件,则上面的代码大约占首次下载的18%(大约是2.3M标记)。

但是,如果我更改命令以使它们最后有http://download.microsoft.com/download/5/F/C/5FC4F80C-242D-423B-9A11-9510A013152D/Dolphins.themepack,则下载会毫无问题地进行,因此我怀疑它很可能是>nul: 2>nul:写入其输出的方式的问题(没有换行符)。如果你不在输出和错误流上使用重定向,它也可以完全运行,这加强了这个断言。

答案 1 :(得分:0)

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

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