コード例 #1
0
        /// <summary>
        /// 根据详情页url下载此页面,解析其中的图片地址并下载
        /// </summary>
        /// <param name="pageUrl"></param>
        /// <param name="type"></param>
        private void downloadPicture(string pageUrl, string type)
        {
            // 获取缓存路径
            string[] arr    = pageUrl.Split('/');
            string   pageId = arr[arr.Length - 2];

            string cacheDir = homeDir + "cache\\";

            CreateDir(cacheDir);
            string cacheFile  = cacheDir + pageId;
            string pictureUrl = null;

            // 从缓存中获取地址
            if (File.Exists(cacheFile))
            {
                pictureUrl = File.ReadAllText(cacheFile);
                if (pictureUrl == "")
                {
                    pictureUrl = null;
                }
            }

            if (pictureUrl == null)
            {
                //获取详情页面信息
                string html = GetHtml(pageUrl);

                // 检查页面是否下载成功
                if (html == null || html == "")
                {
                    throw new Exception("请检查网络");
                }

                //获取图片下载地址
                pictureUrl = Analyze.GetPictureUrl(html);
                if (pictureUrl == null)
                {
                    throw new Exception("无法分析出图片地址:" + pageUrl);
                }

                // 缓存下来图片地址
                CreateFile(cacheFile);
                File.WriteAllText(cacheFile, pictureUrl);
            }

            // 获取文件名字
            string pictureName = Analyze.GetFileName(pictureUrl);

            // 文件完整路径
            string fullFilePath = filePath + type + pictureName;

            // 判断文件是否已经存在
            if (File.Exists(fullFilePath))
            {
                AddItemToTextBox(String.Format("第{0}页第{1}张已存在,跳过", startPageNum, startPicNum));
                startPicNum++;
                skipDownloadNum++;
                return;
            }

            // 使用多线程下载
            Task task = new Task()
            {
                pageNum = startPageNum,
                picNum  = startPicNum,

                Url       = pictureUrl,
                FilePath  = filePath + type,
                FileName  = pictureName,
                TaskStart = new Task.TaskStartDelegate(delegate(int id, Task t)
                {
                    // 下载开始
                }),
                TaskStop = new Task.TaskStopDelegate(delegate(int id, Task t)
                {
                    // AddItemToTextBox("下载被终止" + t.FileName);
                }),
                TaskFinish = new Task.TaskFinishDelegate(delegate(int id, Task t)
                {
                    totalDownloadNum++;

                    // 计算下载所用时间
                    DateTime now  = DateTime.Now;
                    TimeSpan time = now - startTime;

                    AddItemToTextBox(String.Format("第{0}页第{1}张下载完成,已经过{2}秒", t.pageNum, t.picNum, time.TotalSeconds));
                }),
                TaskFail = new Task.TaskFailDelegate(delegate(int id, Task t)
                {
                    AddItemToTextBox(String.Format("第{0}页第{1}张下载失败", t.pageNum, t.picNum));
                }),
            };

            DownloadManager.Add(task);
            startPicNum++;
        }
コード例 #2
0
        /// <summary>
        /// 下载图集
        /// </summary>
        /// <param name="type">gallery或者scraps</param>
        private void download(string type)
        {
            AddItemToTextBox(type + "下载开始");
            GetUserInput();

            // 循环下载第pageNum页
            while (true)
            {
                if (isStop)
                {
                    throw new Exception("正在结束下载");
                }

                // 存储当前页面地址
                string nowUrl = string.Format("http://www.furaffinity.net/{0}/{1}/{2}",
                                              type,
                                              userName,
                                              startPageNum);

                // 下载当前页
                string html = GetHtml(nowUrl);

                // 检查页面是否下载成功
                if (html == null || html == "")
                {
                    throw new Exception("请检查网络");
                }

                // 检查此用户是否存在
                if (!Analyze.HasUser(html))
                {
                    throw new Exception("未查询到该作者,请检查作者名称");
                }

                // 检查此页是否需要登录才能访问
                if (!Analyze.NeedLogin(html))
                {
                    throw new Exception("需要登陆后才能下载此作者的作品");
                }

                //--------开始详情页下载循环------------

                // 获得所有详情页
                List <String> pages = Analyze.GetPages(html);

                // 检查此页是否还有图片,没有的话就结束并等待所有任务完成
                AddItemToTextBox(String.Format("第{0}页共{1}张图片", startPageNum, pages.Count));
                if (pages.Count == 0)
                {
                    return;
                }

                for (int i = startPicNum - 1; i < pages.Count; ++i)
                {
                    // 停止时不再添加新的任务
                    if (isStop)
                    {
                        throw new Exception("正在结束下载");
                    }
                    downloadPicture(pages[i], type);
                }
                startPicNum = 1;
                startPageNum++;
            }
        }
コード例 #3
0
        /// <summary>
        /// 下载图集
        /// </summary>
        /// <param name="type">gallery或者scraps</param>
        private State download(string type)
        {
            AddItemToTextBox(type + "下载开始");
            initDownload();

            //初始化参数
            string[] allPages;//存储详情页地址

            //循环下载第pageNum页
            while (true)
            {
                State pageState;
                //存储当前页面地址
                string nowUrl = string.Format("http://www.furaffinity.net/{0}/{1}/{2}",
                                              type,
                                              userName,
                                              startPageNum);

                //下载当前页
                pageState = Download.GetGeneralContent(nowUrl, cookie);
                if (pageState.code == StateCode.error)
                {
                    AddItemToTextBox(pageState.message);
                    return(new State(StateCode.error));
                }

                //检查此用户是否存在
                string nowPage = pageState.message;
                if (Analyze.checkName(nowPage, userName) == false)
                {
                    AddItemToTextBox("未查询到该作者,请检查作者名称");
                    return(new State(StateCode.error));
                }

                //检查此页是否还有图片,没有的话输出错误日志
                pageState = Analyze.checkPage(nowPage);
                if (pageState.code == StateCode.finish)
                {
                    AddItemToTextBox(pageState.message);
                    break;
                }
                else if (pageState.code == StateCode.error)
                {
                    AddItemToTextBox(pageState.message);
                    return(new State(StateCode.error));
                }

                //--------开始详情页下载循环------------

                //获得所有详情页
                allPages = Analyze.getNextPages(nowPage);

                for (int i = startPicNum - 1; i < allPages.Length; ++i)
                {
                    pageState = downloadPicture(allPages[i], type);

                    if (pageState.code == StateCode.finish)
                    {
                        return(new State(StateCode.finish));
                    }
                    else if (pageState.code == StateCode.error)
                    {
                        return(new State(StateCode.error));
                    }
                }
                startPicNum = 1;
                startPageNum++;
            }
            return(new State(StateCode.ok));
        }
コード例 #4
0
        /// <summary>
        /// 根据详情页url下载此页面,解析其中的图片地址并下载
        /// </summary>
        /// <param name="pageUrl"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        private State downloadPicture(string pageUrl, string type)
        {
            State pageState;

            //如果已经到达最大下载量,则停止下载
            if (maxDownloadNum > 0 && singleDownloadNum >= maxDownloadNum)
            {
                return(new State(StateCode.finish));
            }

            //获取详情页面信息
            pageState = Download.GetGeneralContent(pageUrl, cookie);
            if (pageState.code == StateCode.error)
            {
                AddItemToTextBox(pageState.message);
                return(new State(StateCode.error));
            }

            //获取图片下载地址
            string pictureUrl = Analyze.getPictureUrl(pageState.message);

            if (pictureUrl == null)
            {
                AddItemToTextBox("无法找到下载地址");
                return(new State(StateCode.error));
            }

            //获取文件名字
            string pictureName = Analyze.getFilename(pictureUrl);

            //开始下载
            AddItemToTextBox("第" + startPageNum + "页" + "第" + startPicNum + "张下载开始");
            AddItemToTextBox("文件名:" + pictureName);

            //文件完整路径
            string fullFilePath = filePath + type + pictureName;

            //判断文件是否已经存在
            if (File.Exists(fullFilePath))
            {
                AddItemToTextBox("文件已存在,跳过下载\r\n");
                startPicNum++;
                skipDownloadNum++;
                singleDownloadNum++;
                return(new State(StateCode.ok));
            }

            //获取下载前的时间
            DateTime before = DateTime.Now;

            pageState = Download.GetFileContent(pictureUrl, filePath + type, pictureName);
            if (pageState.code == StateCode.error)
            {
                AddItemToTextBox("下载失败,原因是:" + pageState.message);
                return(new State(StateCode.error));
            }

            //获取下载后的时间
            DateTime after = DateTime.Now;
            //计算下载所用时间
            TimeSpan speed = after - before;

            AddItemToTextBox(speed.TotalSeconds + "秒下载完成\r\n");
            startPicNum++;
            fullDownloadNum++;
            singleDownloadNum++;
            return(new State(StateCode.ok));
        }
コード例 #5
0
        /// <summary>
        /// 下载图集
        /// </summary>
        /// <param name="type">gallery或者scraps</param>
        private void download(string type)
        {
            AddItemToTextBox(type + "下载开始");
            GetUserInput();

            // 循环下载第pageNum页
            while (true)
            {
                try
                {
                    if (isStop)
                    {
                        throw new Exception("正在结束下载");
                    }

                    // 存储当前页面地址
                    string nowUrl = string.Format("https://www.furaffinity.net/{0}/{1}/{2}",
                                                  type,
                                                  userName,
                                                  startPageNum);

                    // 下载当前页
                    string html = GetHtml(nowUrl);

                    // 检查页面是否下载成功
                    if (html == null || html == "")
                    {
                        throw new NetworkException("请检查网络");
                    }

                    // 检查此用户是否存在
                    if (!Analyze.HasUser(html))
                    {
                        throw new NoSuchArtistException("未查询到该作者,请检查作者名称");
                    }

                    // 检查此页是否需要登录才能访问
                    if (!Analyze.NeedLogin(html))
                    {
                        throw new NeedLoginException("需要登陆后才能下载此作者的作品");
                    }

                    //--------开始详情页下载循环------------

                    // 获得所有详情页
                    List <String> pages = Analyze.GetPages(html);

                    // 检查此页是否还有图片,没有的话就结束并等待所有任务完成
                    AddItemToTextBox(String.Format("第{0}页共{1}张图片", startPageNum, pages.Count));
                    if (pages.Count == 0)
                    {
                        return;
                    }

                    for (int i = startPicNum - 1; i < pages.Count; ++i)
                    {
                        // 停止时不再添加新的任务
                        if (isStop)
                        {
                            throw new InterruptException("正在结束下载");
                        }

                        // 在到达最大下载量时停止
                        if (maxDownloadNum != 0 && currentDownloadTaskNum >= maxDownloadNum)
                        {
                            AddItemToTextBox("已到达最大任务量,正在等待下载完成");
                            return;
                        }

                        currentDownloadTaskNum++;
                        downloadPicture(pages[i], type);
                    }
                    startPicNum = 1;
                    startPageNum++;
                }
                catch (NetworkException)
                {
                    if (checkBoxRetry.Checked)
                    {
                        AddItemToTextBox("网络不稳定,将在一秒后重试");
                        Thread.Sleep(1000);
                    }
                    else
                    {
                        throw;
                    }
                }
            }
        }