使用 Web 客户端 DownloadFileAsync 多个文件

2023-12-11

描述
使用 webclient 的 DownloadFileAsync 下载多个文件,并利用文本文件作为 URL 输入进行下载。

Problem
我使用的方法根本不会下载文件。只是运行,什么也不做。它填充列表数组,然后退出程序而不下载单个文件。我用谷歌搜索解决方案,但发现人手不足。然后尝试在此处的数据库中搜索具有相同结果的解决方案。任何帮助表示赞赏。

问题

  1. 为什么这个方法行不通?
  2. 我可以做些什么来改进这一点并从中学习。

Code
下载Class.cs

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Net;
using System.Threading;
using System.Windows.Forms;

namespace ThreadTest
{
    class DownloadClass
    {
        public struct download
        {
            public static string URL { get; set; }
            public static string file { get; set; }
            public static string[] link;
            public static int downloadcount;
        }

        public static List<string> list = new List<string>();
        public static WebClient wc = new WebClient();

        public static void Download()
        {
            int count = 0;
            download.URL = list[0];
            Uri URI = new Uri(download.URL);
            UriBuilder uri = new UriBuilder(URI);
            download.link = uri.Path.ToLower().Split(new char[] { '/' });

            count = 0;
            // Find file
            foreach (string abs in download.link)
            {
                count++;
                if (abs.ToLower().Contains(".html") || abs.ToLower().Contains(".exe") || abs.ToLower().Contains(".txt"))
                {
                    try
                    {
                        download.file = download.link[count];
                        wc.Proxy = null;
                        wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
                        wc.DownloadFileAsync(URI, Application.StartupPath + "\\" + download.file);
                        break;
                    }
                    catch (Exception)
                    { }
                }
            }
        }

        public static void BeginDownload()
        {
            new Thread(Download).Start();
        }

        public static void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            int count = 0;
            download.downloadcount++;
            download.URL = list[0];
            Uri URI = new Uri(download.URL);
            UriBuilder uri = new UriBuilder(URI);

            download.link = uri.Path.ToLower().Split(new char[] { '/' });

            count = 0;
            // Find file
            foreach (string abs in download.link)
            {
                count++;
                if (abs.ToLower().Contains(".html") || abs.ToLower().Contains(".exe") || abs.ToLower().Contains(".txt"))
                {
                    try
                    {
                        download.file = download.link[count];
                    }
                    catch (Exception)
                    { }
                }
            }
            list.RemoveAt(0);
            if (list.Count > 0)
            {
                wc.DownloadFileAsync(URI, list[download.downloadcount], Application.StartupPath + "\\" + download.file);
            }
            else
            {
                Console.WriteLine("Downloading is done.");
                Environment.Exit(0);
            }
        }
    }
}

Program.cs(主类)

using System;
using System.IO;
using System.Collections.Generic;
using System.Windows.Forms;

namespace ThreadTest
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Usage: {0} <download txtfile>", Environment.GetCommandLineArgs()[0]);
                Environment.Exit(0);
            }

            int counter = 0;
            string line;
            string format = string.Format("{0}\\{1}", Application.StartupPath, args[0]);

            // Read the file line by line.
            using(StreamReader file = new StreamReader(format))
            {
                while ((line = file.ReadLine())!= null)
                {
                    // Store urls in a list.
                    DownloadClass.list.Add(line);
                    counter++;
                }
            }
            DownloadClass.BeginDownload();
        }
    }
}

除了糟糕的设计之外,还有很多问题会导致您的代码无法(或无法正常工作)。

  1. 您需要确保您的应用程序在下载某些内容时仍然存在。您当前的应用程序立即退出(您必须等待主程序中的下载完成)。
  2. 您的应用程序可能会多次下载同一文件,但根本不下载其他文件(当以异步=多线程方式使用对象时,您需要完全锁定对象,就像访问静态对象时一样)顺便说一句:根本不要使用静态对象首先要避免这种情况。
  3. 即使 2 被更正,它仍然可能多次下载相同的文件到相同的文件名中,从而失败。

只要您不了解多线程,我建议您使用同步方法来避免所有这些问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Web 客户端 DownloadFileAsync 多个文件 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我

随机推荐

  • Visual Studio 2015 IntelliSense 不显示所有方法

    我最近从 2013 升级到 Visual Studio 2015 因为出于某种原因 即使在多次安装尝试之后 2013 也无法在 Windows 10 上运行 The only issue is IntelliSense is not dis
  • 使用命令行上传到 iTunesConnect 时如何指定应用程序 ID

    Summary 我正在尝试将我的应用程序自动上传到 iTunes Connect 我至少有 6 个应用程序 并且全部都处于 准备上传 状态 问题是当我尝试使用命令行将应用程序上传到 iTunesConnect 时 出现以下错误消息 警告 i
  • Oracle聚合函数返回一组随机值?

    标准 SQL 聚合函数max 将返回一组中的最高值 min 将返回最低的 Oracle中是否有聚合函数可以从组中返回随机值 或者某种技术来实现这一目标 例如 给定表foo group id value 1 1 1 5 1 9 2 2 2 4
  • 返回 n 中 k 个元素的所有组合的算法

    我想编写一个函数 它接受一个字母数组作为参数 并选择其中的一些字母 假设您提供一个包含 8 个字母的数组 并希望从中选择 3 个字母 那么你应该得到 8 8 3 3 56 返回数组 或单词 每个数组由 3 个字母组成 计算机编程艺术第 4
  • VirtualWebappLoader 或类似的WebLogic 将目录添加到war 的类路径中?

    如何在部署到 WebLogic 的 war 的类路径上提供外部目录 将在其中部署其他 jar 我熟悉如何通过定义一个在 Tomcat 上执行此操作Loadercontext xml 中的元素并包括virtualClasspath指定的属性A
  • 底层连接已被 linkedin 关闭

    我们有一个使用 Net Framework 4 6 1 运行的应用程序 可以访问 Linkedin 调用端点 https www linkedin com oauth v2 accessToken 它一直工作到 2020 年 7 月 14
  • C结构数组初始化

    我有结构 struct ABC int a int b 和它的数组 struct ABC xyz 100 我想初始化它 a 10 和 b 20 对于所有数组元素 哪种方法更好 虽然没有特别优雅的方式初始化在C语言中像这样的大数组是可能的 你
  • 在 javascript 服务器端连接 MySQL,无需使用 Node.js

    我有一个与服务器一起运行的 JavaScript 应用程序 例如nginx or eclipse local server 我想知道是否可以将其与mysql服务器数据库连接 我知道他们有很多npm packages for nodejs应用
  • jQuery:取消绑定事件处理程序以稍后再次绑定它们

    有谁知道如何取消绑定事件处理程序集 但记住它们以便稍后再次绑定它们 有什么建议么 项目的数据中有一个事件元素 这应该可以开始 您可以在解除绑定之前读取元素并将处理程序存储在数组中 如果您需要更多帮助 请发表评论 我通过阅读 fn clone
  • NLTK导入错误

    我是 Python 和 NLTK 的新手 我一直在尝试寻找解决问题的方法 但尚未找到解决方案 希望有人可以帮助我 我目前运行的是 64 位 Windows 8 我已按照 NLTK 网站上的说明进行操作 http www nltk org i
  • 如何在 FileOpen 对话框中禁用 Shell 扩展

    我说的是 Windows shell 扩展 我有一个 shell 扩展 它可以显示我的自定义文件类型的特定属性 例如 filetype 当然 这会导致我的 shell 扩展 dll 被加载到 explorer exe 进程中 但现在如果我在
  • 是否应该谨慎使用 FirebaseDatabase.getInstance()?

    例如 当我在 android 中使用 SQLiteDatabase 时 打开 关闭大量 SQLiteDatabase 助手通常不是一个好主意 相反 最好创建一种单例 以确保只打开 1 个数据库 假设我有一个带有静态方法的类 它执行大量需要
  • 如何在Android中使用自定义日历视图以及如何设置提醒提醒?

    我需要制作一个 Android 应用程序来显示日历控件 我曾试图在Android提供的默认小部件中找到这样的控件 但没有找到 如何在Android应用程序中集成日历控件 我还希望日历能够添加特定日期的事件和提醒 在计时器中同时播放 2 个声
  • 如何使用numpy将RGB图像转换为基于颜色的one-hot编码3d数组?

    简而言之 我想做的与这个问题类似 将 RGB 图像转换为索引图像 但我想要获取 n 通道图像 而不是 1 通道索引图像 其中img h w 是一个one hot编码向量 例如 如果输入图像是 0 0 0 255 255 255 索引 0 分
  • MediaCodec 编码视频底部有绿条且色度搞砸

    我开始了一个项目Grafika并对其进行了修改 我有一个框架 与原始框架没有太大不同 它可以捕获来自Camera并同时以不同的分辨率将其连续编码为视频 MediaCodec 用于编码 配置为使用COLOR FormatSurface为了让我
  • 当使用“all one word”时,有什么方法可以使 html 文本换行吗? [复制]

    这个问题在这里已经有答案了 可能的重复 有没有办法在 div 中自动换行 我有这个 css 和 html 问题 我有一个描述 我想将其放入一个 100 像素宽的框中 并且我希望文本沿着页面向下流动 我设置了一个这样的div div styl
  • SVG 在 Firefox 中完全不可见

    在将其标记为重复之前 我们已经确保宽度和高度设置正确 我将其描述为不可见 因为尽管它占用了正确的空间 甚至以正确的尺寸加载到图像上 但图像的内容在网站 网络选项卡以及直接查看 SVG 时都是空的 基本上 无论我们如何显示或查看它 实际的 S
  • OpenGL-ES 2.0 中未声明 glMapBuffer

    我正在 ubuntu 10 10 中通过使用 kronos 和 pvrsd kNow 代码进行 Opengl es 2 0 include
  • 懒惰、贪婪和所有格量词之间有什么区别?

    以下量词在场景 速度等方面有何不同 and 全部匹配0或1次 and 全部匹配0次或多次 and 全部匹配1次或多次 and are greedy and are 不情愿 懒惰 and are 所有格 谁能帮助我理解这些术语的含义 为什么同
  • 使用 Web 客户端 DownloadFileAsync 多个文件

    描述使用 webclient 的 DownloadFileAsync 下载多个文件 并利用文本文件作为 URL 输入进行下载 Problem我使用的方法根本不会下载文件 只是运行 什么也不做 它填充列表数组 然后退出程序而不下载单个文件 我