【问题标题】:Use wget command to download multiple files at different locations使用 wget 命令在不同位置下载多个文件
【发布时间】:2013-05-09 06:05:33
【问题描述】:

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

【问题讨论】:

  • 它怎么'不工作'?

标签: c# download wget


【解决方案1】:

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

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

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


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

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

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。


现在,正如您在您的一个 cmets 中所说的那样,更大的文件会变得有趣。如果我将所有三个 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 写入其输出的方式存在问题(没有换行符)。如果您不对输出和错误流使用重定向,它也可以完全工作,这会加强该断言。

【讨论】:

  • 是否可以顺序下载文件而不是启动3个进程?
  • @user1650891,是的,只需按顺序执行每个进程,就像您所做的一样(启动进程,等待它完成),假设您一次只需要一个进程。将其重构为函数将是有利的。如果您的意思是一个进程而不考虑并发性,请将所有命令放入一个x.cmd 文件并在一个进程中运行cmd /c x.cmd
  • 如果我下载 1 个文件,上面的示例可以正常工作.. 所以我知道启动一个进程不是问题..
  • sry..我没有得到你的答案..你能解释一下吗
  • @user1650891,我已经添加了更多细节,希望你现在更清楚。
【解决方案2】:

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

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

【讨论】:

  • 好的,这是一个开始。尝试在用于下载的三行之间写一些东西到控制台,看看它是否越过了它们。
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 2019-05-30
  • 2016-04-24
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
相关资源
最近更新 更多