亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++調用迅雷接口解析XML下載功能(迅雷下載功能)

2020-01-26 15:41:39
字體:
來源:轉載
供稿:網友

迅雷下載庫的網址:http://thunderplatform.xunlei.com

復制代碼 代碼如下:

// FileName: Download.h
#pragma once
#include "lib/XLDownload.h"
#include "lib/XLError.h"
#include <vector>

// 下載隊列的大小,決定同時開啟下載線程的數量
const int LIMIT = 2;

struct Down
{
    // 解析出來的下載地址
    CString strDownURL;
    // 保存的路徑
    CString strSavePath;
};

struct Flag
{
    DWORD dwFlag;            // 記錄下載線程實時狀態
    LONG lTaskId;            // 記錄對應任務ID號
    ULONGLONG ullFileSize;    // 下載文件大小
    ULONGLONG ullRecvSize;    // 已下載大小
};

class CDownload
{
private:

    // 保存下載的日志信息
    std::vector<CString> strLogArr;

    // 解析XML文件
    //void Analysis (LPCTSTR lpPathXML, LPCTSTR lpBegin, LPCTSTR lpEnd);
    void Analysis (LPCTSTR lpPathXML);

    // 開始下載
    void Start (void);

    // 調用迅雷的下載接口
    void CreateDownThread (int n);

    // 下載任務查詢監控線程
    static void DownQury (LPVOID ptr);

    // 保存日志
    void SaveLog (LPCTSTR lpPathAndName);

public:

    // 保存解析出來的下載隊列
    std::vector<Down> strDownArr;

    // 記錄最新的下載位置
    int m_nIndex;

    // 下載隊列的大小,對應位為1時,該下載位為空,可以啟動新的下載線程
    struct Flag Flags[LIMIT];

    // 總共的下載數
    int m_nTotal;

    // 失敗的下載數
    int m_nFail;

    // 成功的下載數
    int m_nSuccess;

    CDownload();
    ~CDownload();
    BOOL DownloadFilesByXML(LPCTSTR lpPahtXML);
};

復制代碼 代碼如下:

// FileName: Download.cpp
#include "stdafx.h"
#include "Download.h"
#include <Shlwapi.h>
#include <locale.h>
#pragma comment(lib, "lib//XLDownload.lib")

// 包含XTP界面庫頭文件
#include "XTToolkitPro.h"

CDownload::CDownload()
{
    // 初始化
    m_nIndex = 0;

    // 初始化為沒有下載線程
    for (int n=0; n<LIMIT; n++)
    {
        Flags[n].dwFlag = 1;
        Flags[n].lTaskId = n;
    }

    m_nSuccess = 0;
    m_nTotal = 0;
    m_nFail = 0;
}

CDownload::~CDownload()
{

}

BOOL CDownload::DownloadFilesByXML(LPCTSTR lpPathXML)
{
    DWORD dwRet = XL_SUCCESS;

    // 檢測XML文件是否存在
    if (!PathFileExists(lpPathXML))
    {
        ::MessageBox(NULL, _T("XML文件不存在!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);   
        return FALSE;
    }

    // 解析XML文件
    Analysis(lpPathXML);

    // 統計下載鏈接數
    m_nTotal = strDownArr.size();

    // 開始下載
    Start();

    return TRUE;
}

//void CDownload::Analysis(LPCTSTR lpPathXML, LPCTSTR lpBegin, LPCTSTR lpEnd)
void CDownload::Analysis(LPCTSTR lpPathXML)
{
    // 讀取XML文件
    CXTPPropExchangeXMLNode px(TRUE, NULL, _T("DownLoadInfo"));

    if (!px.LoadFromFile(lpPathXML))
    {

        ::MessageBox(NULL, _T("打開XML文件出錯!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
        return;
    }

    if (!px.OnBeforeExchange())
    {
        ::MessageBox(NULL, _T("OnBeforeExchange false!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
        return;
    }

    px.SetCompactMode(TRUE);

    CXTPPropExchangeEnumeratorPtr enumItem(px.GetEnumerator(_T("Item")));
    POSITION posItem = enumItem->GetPosition();

    CString strLocalName;
    Down down;

    // 遍歷所有的結點
    while (posItem)
    {
        CXTPPropExchangeSection sec(enumItem->GetNext(posItem));

        if (sec->IsLoading())
        {
            PX_String(sec->GetSection(_T("URL")), NULL, down.strDownURL);
            PX_String(sec->GetSection(_T("LocalPath")), NULL, down.strSavePath);
            PX_String(sec->GetSection(_T("LocalName")), NULL, strLocalName);

            down.strSavePath += strLocalName;
            // 路徑轉換
            down.strSavePath.Replace('/', '//');

            strDownArr.push_back(down);
        }
    }
}

// 下載任務查詢
void CDownload::DownQury (LPVOID ptr)
{
    CDownload* pDown = (CDownload*)ptr;
    bool nSign = true;
    DWORD dwRst;
    TCHAR errorBuf[500];
    DWORD dwSize = 500;
    CString strLog;

    // 如果沒有下載完成一直下載
    while ((pDown->m_nIndex < (pDown->strDownArr).size()) || nSign)
    {
        int n = 0;
        LONG temp = -1;
        nSign = false;

        while (n<LIMIT)
        {
            switch(pDown->Flags[n].dwFlag)
            {
                // 沒有下載,開始新的下載
                case 1 :
                    pDown->CreateDownThread(n);
                    dwRst = XLQueryTaskInfo(pDown->Flags[n].lTaskId, &temp, &(pDown->Flags[n].ullFileSize), &(pDown->Flags[n].ullRecvSize));

                    if (dwRst == XL_SUCCESS && pDown->m_nIndex<pDown->strDownArr.size())
                    {
                        pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
                        pDown->strLogArr.push_back(_T("state:suceess"));
                        pDown->Flags[n].dwFlag = temp;
                    }
                    else
                    {
                        if (pDown->m_nIndex < pDown->strDownArr.size())
                        {
                            pDown->m_nFail += 1;
                            XLGetErrorMsg(dwRst, errorBuf, dwSize);
                            pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
                            strLog.Format(_T("state:%s"), errorBuf);
                            pDown->strLogArr.push_back(strLog);
                        }
                        pDown->m_nIndex += 1;
                    }
                    break;

                // 成功下載完, 開始新的下載
                case 11:
                    pDown->CreateDownThread(n);
                    dwRst = XLQueryTaskInfo(pDown->Flags[n].lTaskId, &temp, &(pDown->Flags[n].ullFileSize), &(pDown->Flags[n].ullRecvSize));
                    if (dwRst == XL_SUCCESS && pDown->m_nIndex<pDown->strDownArr.size())
                    {
                        pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
                        pDown->strLogArr.push_back(_T("state:suceess"));
                        pDown->Flags[n].dwFlag = temp;
                    }
                    else
                    {
                        if (pDown->m_nIndex < pDown->strDownArr.size())
                        {
                            pDown->m_nFail += 1;
                            XLGetErrorMsg(dwRst, errorBuf, dwSize);
                            pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
                            strLog.Format(_T("state:%s"), errorBuf);
                            pDown->strLogArr.push_back(strLog);
                        }
                        pDown->m_nIndex += 1;
                    }
                    break;

                // 下載失敗,開始新的下載
                case 12:
                    pDown->CreateDownThread(n);
                    dwRst = XLQueryTaskInfo(pDown->Flags[n].lTaskId, &temp, &(pDown->Flags[n].ullFileSize), &(pDown->Flags[n].ullRecvSize));
                    if (dwRst == XL_SUCCESS && pDown->m_nIndex<pDown->strDownArr.size())
                    {
                        pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
                        pDown->strLogArr.push_back(_T("state:suceess"));
                        pDown->Flags[n].dwFlag = temp;
                    }
                    else
                    {
                        if (pDown->m_nIndex < pDown->strDownArr.size())
                        {
                            pDown->m_nFail += 1;
                            XLGetErrorMsg(dwRst, errorBuf, dwSize);
                            pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
                            strLog.Format(_T("state:%s"), errorBuf);
                            pDown->strLogArr.push_back(strLog);
                        }
                        pDown->m_nIndex += 1;
                    }
                    break;

                // 默認處理
                default:
                    XLQueryTaskInfo(pDown->Flags[n].lTaskId, &temp, &(pDown->Flags[n].ullFileSize), &(pDown->Flags[n].ullRecvSize));
                    pDown->Flags[n].dwFlag = temp;
                    if (temp == enumTaskStatus_Download)
                    {
                        nSign = true;
                    }
            }
            n++;
        }
        //Sleep(1);
    }

    // 保存日志
    pDown->SaveLog(_T("C://down.log"));

    CString strTemp;
    strTemp.Format(_T("下載完成! 下載總數:%d 成功總數%d 失敗總數%d 日志存在位置:C://down.log"), pDown->m_nTotal, pDown->m_nSuccess, pDown->m_nFail);
    ::MessageBox(NULL, strTemp, _T("友情提示"), MB_OK);

    pDown->m_nSuccess = 0;
    pDown->m_nTotal = 0;
    pDown->m_nFail = 0;

    // 恢復初始狀態
    pDown->m_nIndex = 0;

    // 恢復為下載隊列為空
    for (int n=0; n<LIMIT; n++)
    {
        pDown->Flags[n].dwFlag = 1;
        pDown->Flags[n].lTaskId = n;
        // 無論是否下載成功,都必須調用XLStopTask
        XLStopTask(pDown->Flags[n].lTaskId);
    }

    //釋放資源
    XLUninitDownloadEngine();
}

void CDownload::Start (void)
{
    int nIndex = 0;

    // 1、初始化下載引擎
    if ( FALSE == XLInitDownloadEngine() )
    {
        ::MessageBox(NULL, _T("初始化下載引擎失敗!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
        return;
    }

    // 下載任務查詢監控線程
    ::CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)DownQury, this, 0, NULL);
}

// 調用迅雷的下載接口
void CDownload::CreateDownThread (int n)
{
    DWORD dwRst = 0;
    if (m_nIndex < strDownArr.size())
    {
        dwRst = XLURLDownloadToFile(strDownArr[m_nIndex].strSavePath, strDownArr[m_nIndex].strDownURL, NULL, Flags[n].lTaskId);
        if (dwRst == XL_SUCCESS)
        {
            Flags[n].dwFlag = enumTaskStatus_Download;
            m_nIndex++;
            m_nSuccess++;
        }
    }
    else
    {
        m_nIndex = strDownArr.size();
    }
}

void CDownload::SaveLog (LPCTSTR lpPathAndName)
{
    CStdioFile file;
    std::vector<CString>::iterator iter;

    // 保存現在的語言環境
    char * old_locale = _strdup(setlocale(LC_CTYPE,NULL));
    // 設置中文環境
    setlocale(LC_CTYPE, "chs");

    if (file.Open(lpPathAndName, CFile::modeCreate|CFile::modeWrite))
    {
        for (iter=strLogArr.begin(); iter!=strLogArr.end(); iter++)
        {
            file.WriteString(*iter);
            file.WriteString(_T("/n"));
        }
    }
    file.Close();
    // 還原語言區域的設置
    setlocale(LC_CTYPE, old_locale);
    //  釋放內存
    free(old_locale);
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品在线观看91| 欧美性高潮床叫视频| 91影院在线免费观看视频| 久久久久久久久91| 国产精品ⅴa在线观看h| 精品国产精品三级精品av网址| 美日韩丰满少妇在线观看| 韩国视频理论视频久久| 欧美精品激情在线观看| 国产精品视频一区二区高潮| 日韩美女在线看| 久久精品这里热有精品| 日韩美女视频免费在线观看| 4438全国亚洲精品在线观看视频| 国产在线精品自拍| 97涩涩爰在线观看亚洲| 日韩美女视频中文字幕| 国产精品久久久91| 精品夜色国产国偷在线| 高清欧美一区二区三区| 精品中文字幕久久久久久| 91在线免费网站| 亚洲精品福利资源站| 亚洲国产成人爱av在线播放| 欧美理论电影网| 亚洲人精选亚洲人成在线| 色777狠狠综合秋免鲁丝| 岛国av一区二区三区| 色妞色视频一区二区三区四区| 欧美激情视频在线| 久久精品国产精品| 国产亚洲a∨片在线观看| 91在线视频成人| 欧美大尺度电影在线观看| 91老司机精品视频| 亚洲精品按摩视频| 91久久精品国产| 欧美精品电影免费在线观看| 欧美激情日韩图片| 中文字幕亚洲一区二区三区五十路| 成人黄色激情网| 久久久久久有精品国产| 亚洲福利在线看| 欧美专区中文字幕| 97在线免费观看| 亚洲精品国产成人| 97在线免费视频| 国产69久久精品成人看| 亚洲成人黄色网址| 日韩色av导航| 中文在线资源观看视频网站免费不卡| 日韩精品高清在线| 欧美在线欧美在线| 日韩免费精品视频| 操人视频在线观看欧美| 欧美在线视频播放| 日本久久久久久久| 久久久久久成人精品| 欧美激情va永久在线播放| 亚洲第一页在线| 国产精品第10页| 亚洲人成五月天| 色av吧综合网| 亚洲精品自在久久| 亚洲小视频在线| 国产精品久久久久秋霞鲁丝| 欧美国产日韩在线| 亚洲小视频在线观看| 国内精品视频一区| 激情久久av一区av二区av三区| 亚洲成人999| 国产乱人伦真实精品视频| 欧美一区亚洲一区| 日韩av手机在线看| 亚洲欧洲国产伦综合| 国产大片精品免费永久看nba| 欧洲亚洲免费在线| 欧美在线免费视频| 亚洲午夜女主播在线直播| 亚洲成年网站在线观看| 精品久久久久国产| 国产精品亚洲激情| 91丝袜美腿美女视频网站| 亚洲黄色av女优在线观看| 日韩精品www| 日韩精品高清视频| 中文字幕日韩视频| 国产精品成人免费视频| 亚洲国产精品福利| 亚洲字幕一区二区| 亚洲丝袜av一区| 国产成人av在线| 亚洲天堂免费视频| 久久免费成人精品视频| 国产不卡av在线| 最近2019中文字幕大全第二页| 在线视频欧美日韩精品| 欧美性猛交xxxxx水多| 成人黄在线观看| 在线观看国产精品日韩av| 国产精品精品视频一区二区三区| 国产女人18毛片水18精品| 日韩欧美中文字幕在线播放| 激情懂色av一区av二区av| 成人乱人伦精品视频在线观看| 亚洲香蕉在线观看| 亚洲天堂网站在线观看视频| 69视频在线免费观看| 国产精品日韩在线一区| 中文国产成人精品| 中国china体内裑精亚洲片| 国产欧美日韩中文| 91国内揄拍国内精品对白| 亚洲精品久久久一区二区三区| 午夜精品视频在线| 日韩av在线精品| 日韩av综合网站| 欧美日本高清一区| 最新91在线视频| 欧美电影免费播放| 91在线观看免费高清完整版在线观看| 亚洲精品免费网站| 91麻豆国产语对白在线观看| 精品毛片三在线观看| 在线视频欧美日韩| 青青草精品毛片| 26uuu日韩精品一区二区| 亚洲欧美在线一区| 日本老师69xxx| 久久人人看视频| 欧美丝袜一区二区三区| 51精品国产黑色丝袜高跟鞋| 成人精品一区二区三区电影黑人| 国产精品视频久久| 2021国产精品视频| 国产精品va在线播放我和闺蜜| 伊人成人开心激情综合网| 欧美在线视频在线播放完整版免费观看| 国产成人精品国内自产拍免费看| 福利精品视频在线| 日韩电影大全免费观看2023年上| 国语自产精品视频在免费| 欧美日韩成人在线播放| 久久国产一区二区三区| 国产经典一区二区| 久久久亚洲欧洲日产国码aⅴ| 国产成人精品视频在线| 国产三级精品网站| 国模视频一区二区三区| 国产视频久久久久| 奇米一区二区三区四区久久| 日韩欧美高清在线视频| 日韩精品亚洲元码| 欧美性极品xxxx做受| 日韩欧美在线一区| 国产在线a不卡| 欧美激情极品视频| 日韩亚洲精品电影| 亚洲美女精品成人在线视频| 欧美中文字幕在线视频| 在线观看91久久久久久| 国产久一一精品| 久久久精品一区| 中文字幕亚洲欧美日韩2019|