zoukankan      html  css  js  c++  java
  • Net WebClient 异步批量下载文件

    1.文件提前使用爬虫整理好,放到了demo文件夹下的1.txt文件中,文件格式如:

    http://www.banktunnel.eu/tumblr.com/tabea-lara.2_files/tumblr_n4kxopXkJ41sq93cpo10_1280.jpg
    http://www.pptok.com/wp-content/uploads/2012/08/xunguang-9.jpg
    http://www.xiangshu.com/UploadFiles/Day_190324/52_387785_3163ee0990499b7.jpg
    http://www.xiangshu.com/UploadFiles/Day_190324/52_387785_25d8b5e402d0391.jpg
    https://bbs-fd.zol-img.com.cn/t_s800x5000/g4/M04/0A/0D/Cg-4WVPNFNWIA9vCAAmNhS2C8eAAAPyvQApsb4ACY2d098.jpg
    https://bbs-fd.zol-img.com.cn/t_s800x5000/g4/M04/0A/0D/Cg-4WlPNFOGIIc0VAAom_BUlna4AAPyvQCLDjYACicU104.png
    https://bbs-fd.zol-img.com.cn/t_s800x5000/g4/M04/0A/0D/Cg-4WlPNFOqIWH2cAAXWIl1DvA4AAPyvQDbhzkABdY6485.jpg
    https://bbs-fd.zol-img.com.cn/t_s800x5000/g4/M04/0A/0D/Cg-4WVPNFPGIfiurAAKxaF37_vcAAPyvQGII2YAArGA075.jpg
    http://www.hr.com.cn/attachments/2015/06/b16af76b691f47609f3397e8cdd9c1e2.jpg
    http://www.hr.com.cn/attachments/2015/06/226fc8acee0d478c9588ded1d04616b1.jpg
    http://www.hr.com.cn/attachments/2015/06/c36e39b67d4c410cb794f553a271377b.jpg

    2.新建DownloadFile类

    public class DownloadFile
        {
            public DownloadFile()
            {           
            }
            public DownloadFile(string fileName, string fileFolder,string saveFileName)
            {
                FileName = fileName;
                FileFolder = fileFolder;
                SaveFileName = saveFileName;
            }      
            public string FileName;
            public string FileFolder;
            public string SaveFileName;
        }

    3.Main函数创建下载用文件夹,读取需下载文件名称到List<DownloadFile>中。调用下载方法执行下载。

            private static void Main(string[] args)
            {
                List<string> folders = new List<string>()
                {
                    "demo","其他文件夹","其他文件夹1","xxxx"
                };
                Parallel.ForEach(folders, folder => CreateFolder(folder));
                List<DownloadFile> downloadFiles = new List<DownloadFile>();
                Parallel.ForEach(folders, folder =>
                {
                    downloadFiles.AddRange(ReadFileUrl(folder));
                });
                Logger.Log(Level.Info, "开始任务执行");
                List<Task> tList = new List<Task>();
                downloadFiles.ForEach(p =>
                {
                    tList.Add(
                        TransferWebFileHelper.DownloadingDataFromServerAsync(p)
                    );
                });
                Task.WaitAll(tList.ToArray());           
                Logger.Log(Level.Info, "任务执行结束");
            }

            /// <summary>
            /// 创建下载用文件夹
            /// </summary>
            /// <param name="folderName"></param>
            private static void CreateFolder(string folderName)
            {
                string saveFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, folderName + "_download");
                if (!Directory.Exists(saveFolder))
                {
                    Directory.CreateDirectory(saveFolder);
                }
            }

            /// <summary>
            /// 载入待下载文件到集合
            /// </summary>
            /// <param name="folderName"></param>
            /// <returns></returns>
            static List<DownloadFile> ReadFileUrl(string folderName)
            {
                List<DownloadFile> list = new List<DownloadFile>();
                DirectoryInfo dir;
                List<string> contents = new List<string>();
                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, folderName);
                if (Directory.Exists(path))
                {
                    dir = new DirectoryInfo(path);
                    FileInfo[] files = dir.GetFiles();
                    contents = File.ReadAllLines(files[0].FullName, Encoding.Default).ToList();
                    string saveFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, folderName + "_download");
                    contents.ForEach(fileName =>
                    {
                        //TODO 完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符。
                        string tempFileName = fileName.Split('?')[0].Replace("\", "").Replace(":", "").Replace("*", "").Replace(""", "").Replace("<", "").Replace(">", "").Replace("|", "");
                        int index = tempFileName.LastIndexOf("/");
                        tempFileName = tempFileName.Substring(index + 1, tempFileName.Length - index - 1);
                        int tempFileNameLength = tempFileName.Length;
                        if ((260 - saveFolder.Length - 2) < tempFileNameLength)
                        {
                            int difference = tempFileNameLength - (260 - saveFolder.Length - 2);//差
                            tempFileName = tempFileName.Substring(difference, tempFileName.Length - difference);
                        }
                        tempFileName = GetRandomStr() + "_" + tempFileName;
                        string saveFileName = Path.Combine(saveFolder, tempFileName);
                        var model = new DownloadFile(fileName, folderName, saveFileName);
                        list.Add(model);
                    });
                }
                return list;
            }

    4.下载文件类

        public static class TransferWebFileHelper
        {
            /// <summary>
            /// 新建文件,如果它不存在的话
            /// </summary>
            /// <param name="fileName"></param>
            private static void CreateFile(string fileName)
            {
                if (!File.Exists(fileName))
                {
                    FileStream fileStream = File.Create(fileName);
                    fileStream.Close();
                    fileStream.Dispose();
                }
            }

            /// <summary>
            /// 下载用方法
            /// </summary>
            /// <param name="downloadFile"></param>
            /// <returns></returns>
            public static async Task DownloadingDataFromServerAsync(DownloadFile downloadFile)
            {
                Uri uri = new Uri(downloadFile.FileName);
                string saveFileName = downloadFile.SaveFileName;
                CreateFile(saveFileName);

                using (WebClient client = new WebClient())
                {
                    try
                    {
                        await client.DownloadFileTaskAsync(uri, saveFileName);
                    }
                    catch (WebException ex)
                    {
                        Console.WriteLine($"从 {uri} 下载 {saveFileName}失败");
                        Logger.Log(Level.Info, $"从 {uri} 下载 {saveFileName}失败");
                        Logger.LogException(ex);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"从 {uri} 下载 {saveFileName}失败");
                        Logger.Log(Level.Info, $"从 {uri} 下载 {saveFileName}失败");
                        Logger.LogException(ex);
                    }
                }
            }
        }

    5.其他辅助方法

            private static string[] randomArray = new[]
            {
                "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
                "W", "X", "Y", "Z"
            };
            private static string GetRandomStr()
            {
                Random ran = new Random();
                int i = ran.Next(0, 26);
                Thread.Sleep(1);//尽量让生成的字符每一个都不相同
                return randomArray[i];
            }

  • 相关阅读:
    git命令设置
    spring boot之常用注解(二)
    spring boot之入门配置(一)
    Java核心技术第四章——2.final 和 static
    Java核心技术第四章——1.封装性
    Flutter学习笔记(1)--环境安装
    Android 遍历手机应用,跳转应用市场详情页面
    Android 布局渲染流程与卡顿优化
    weex 数据绑定,动态控制组件的显示内容及样式
    weex常用属性梳理
  • 原文地址:https://www.cnblogs.com/jeff151013/p/11157967.html
Copyright © 2011-2022 走看看