📄 20090304.txt
字号:
::AfxBeginThread(CCodeProjectDlg::Download, this->GetSafeHwnd(), THREAD_PRIORITY_NORMAL, 0);
}
UINT CCodeProjectDlg::Download(LPVOID pParam)
{
HWND hWnd = (HWND)pParam;
int i;
CString *pStr;
CInternetSession session("MyAgent", 1, INTERNET_OPEN_TYPE_PRECONFIG);
if (-1 == _taccess(m_strTargetDir + _T("global.css"), 0))
DownloadFile(session, CString(_T("http://www.codeproject.com/styles/global.css")), m_strTargetDir + _T("global.css"));
//K 下载具体内容
for (i = 0; i < m_aryDownloadItem.GetSize(); ++i)
{
pStr = new CString;
pStr->Format(_T("%s 开始下载!\n"), m_aryDownloadItemName[i]);
::PostMessage(hWnd, WM_USER_DOWNSTATUS, (WPARAM)pStr, 0);
CString strTemp, strCurDir;
for(int j = 0; AfxExtractSubString(strTemp, m_aryDownloadItem[i], j, _T('/')); ++j)
strCurDir = strTemp;
ConfirmDir(m_strTargetDir + strCurDir + _T("\\\\"));
//K 下载分类索引的HTML文件
CString strItemGroup;
DownloadHtml(session, m_aryDownloadItem[i], strItemGroup);
//K 整理HTML文件的内容
CString strStart = _T("<!-- Main Page Contents Start -->"),
strEnd = _T("<!-- Main Page Contents End -->");
long iPotion;
iPotion = strItemGroup.Find(strStart);
iPotion += strStart.GetLength();
strItemGroup.Delete(0, iPotion);
strStart = _T("</TABLE>");
iPotion = strItemGroup.Find(strStart);
iPotion += strStart.GetLength();
strItemGroup.Delete(0, iPotion);
iPotion = strItemGroup.Find(strEnd);
strItemGroup.Delete(iPotion, strItemGroup.GetLength() - iPotion);
CString strSperator = _T("</TABLE>");
strItemGroup.TrimRight();
strItemGroup = strItemGroup.Left(strItemGroup.GetLength() - strSperator.GetLength());
for (int k = -strSperator.GetLength(); -1 != k; )
{
iPotion = k;
k = strItemGroup.Find(strSperator, k + strSperator.GetLength());
}
strItemGroup = strItemGroup.Left(iPotion);
strEnd = _T("</TABLE><H2>Links</H2>");
iPotion = strItemGroup.Find(strEnd);
if (-1 != iPotion) strItemGroup.Delete(iPotion, strItemGroup.GetLength() - iPotion);
CArray<CSTRING, CString> aryItem;
ExtractItem(strItemGroup, CString(_T("<A CString -- Starts Article strStart='_T("<!--' 整理文章的内容 K strItemFile); aryItem[iItems], + www.codeproject.com?) _T(?http: DownloadHtml(session, } continue; _T(?.HTM?)); strCurFileName="strTemp;" strItemGroup.Replace(aryItem[iItems], { !="iHist)" (-1 if iHist="strHistory.Find(aryItem[iItems]);" int 4); - ++j) ?)); _T(? j, AfxExtractSubString(strTemp, j="0;" for(int strCurFileName; strTemp, strItemFileTemp; strItemFile; bItemComplete="true;" bool ++iItems) aryItem.GetSize(); < iItems="0;" (; for 下载文章 fileHist.SeekToEnd(); fileHist.ReadString(strHistory); CFile::typeText); | CFile::modeReadWrite CFile::modeNoTruncate CFile::modeCreate _T(?\\\\hist.txt?), strCurDir fileHist.Open(m_strTargetDir strHistory; fileHist; CStdioFile 历史记录文件 &aryItem); strCurDir, CString(_T(?.asp?)), href?)),>");
strEnd = _T("<!-- Article Ends -->");
iPotion = strItemFile.Find(strStart, 0);
iPotion += strStart.GetLength();
strItemFile.Delete(0, iPotion);
iPotion = strItemFile.Find(strEnd);
strItemFile.Delete(iPotion, strItemFile.GetLength() - iPotion);
strItemFileTemp = strItemFile;
strItemFileTemp.MakeLower();
CArray<CSTRING, CString> aryItemSource;
CString strFileType;
ExtractItem(strItemFileTemp, CString(_T("<A CString K + _T(?http: } { (-1="=" if ++j) ?)); _T(? j, AfxExtractSubString(strTemp, j="0;" for(int strTemp, bItemComplete="bItemComplete" < for strCurDir, href?)), pStr- CString; pStr="new" 更新进度 strCurSourceFileName); _T(?\\\\?) strCurSourceDir="m_strTargetDir" strCurSourceUrl, ?)="=" strCurItemDir www.codeproject.com DownloadFile(session, && ConfirmDir(strCurSourceDir); strTemp; strTemp.Find(_T(?.?))) strTemp.MakeLower(); strCurSourceFileName="strTemp;" strCurSourceUrl.Replace(_T(?\\?), strCurSourceUrl="aryItemSource[l];" strCurDir; strCurSourceFileName; ++l) aryItemSource.GetSize(); l="0;" (int 下载文章中的资源 0, : 1 ? strTemp.Left(1)) (_T(? AfxExtractSubString(strCurItemDir, strTemp.Replace(_T(?\\?), strTemp="aryItem[iItems];" strCurItemDir; &aryItemSource); CString(_T(?.png?)), CString(_T(?src?)), ExtractItem(strItemFileTemp, CString(_T(?.bmp?)), CString(_T(?.gif?)), CString(_T(?.jpg?)), CString(_T(?.rar?)), CString(_T(?<a CString(_T(?.exe?)), CString(_T(?.zip?)),>Format(_T(" %s 下载完毕!\n"), strCurSourceFileName);
::PostMessage(hWnd, WM_USER_DOWNSTATUS, (WPARAM)pStr, 0);
}//end for(l)
//K 保存文章
strItemFile = _T("<LINK href='\"../global.css\"' type=text/css rel='\"stylesheet\"'>\n") + strItemFile;
bItemComplete = bItemComplete && SaveStr2File(strItemFile, m_strTargetDir + strCurDir + _T("\\\\") + strCurFileName + _T(".HTM"));
//K 更新进度
pStr = new CString;
pStr->Format(_T(" %s.htm 下载完毕!\n"), strCurFileName);
::PostMessage(hWnd, WM_USER_DOWNSTATUS, (WPARAM)pStr, 0);
fileHist.WriteString(aryItem[iItems]);
strItemGroup.Replace(aryItem[iItems], strCurFileName + _T(".HTM"));
}//end for(iItem)
//K 保存分类索引文件
strItemGroup = _T("<LINK href='\"../global.css\"' type=text/css rel='\"stylesheet\"'>\n") + strItemGroup;
SaveStr2File(strItemGroup, m_strTargetDir + strCurDir + _T("\\\\index.htm"));
//K 更新进度
pStr = new CString;
pStr->Format(_T(" index.htm 下载完毕!\n"));
::PostMessage(hWnd, WM_USER_DOWNSTATUS, (WPARAM)pStr, 0);
pStr = new CString;
pStr->Format(_T("%s 下载完毕!\n"), m_aryDownloadItemName[i]);
::PostMessage(hWnd, WM_USER_DOWNSTATUS, (WPARAM)pStr, 0);
pStr = new CString;
pStr->Format(_T("==================================================\n"));
::PostMessage(hWnd, WM_USER_DOWNSTATUS, (WPARAM)pStr, 0);
fileHist.Close();
}//K end for(i)
::PostMessage(hWnd, WM_USER_DOWNCOMPLETE, 0, 0);
return 0;
}
LRESULT CCodeProjectDlg::OnDownStatus(WPARAM wParam, LPARAM lParam)
{
CString *pStr;
pStr = (CString *)wParam;
m_editStatus.SetSel(m_editStatus.GetWindowTextLength(), m_editStatus.GetWindowTextLength());
m_editStatus.ReplaceSel(*pStr);
delete pStr;
return 0;
}
LRESULT CCodeProjectDlg::OnDownComplete(WPARAM, LPARAM)
{
AfxMessageBox(_T("下载完成!"));
m_bWorking = false;
m_btnOK.EnableWindow();
return 0;
}
void CCodeProjectDlg::OnStaticWeb()
{
// TODO: Add your control notification handler code here
//if (!m_bWorking) m_btnOK.EnableWindow();
ShellExecute(NULL, _T("open"), _T("http://dalang.nease.net/fengnu.htm"), NULL, NULL, 2);
ShellExecute(NULL, _T("open"), _T("http://kjapan.sdedu.net/"), NULL, NULL, 2);
}
void CCodeProjectDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CDlgExplain dlg;
dlg.DoModal();
}
bool CCodeProjectDlg::ExtractItem(CString &strContant, CString &strStart, CString &strCondition, CString &strCurDir, void *pAry)
{
CArray<CSTRING, CString> *pArray;
pArray = (CArray<CSTRING, CString> *)pAry;
CString strEnd, strNetDir = _T("http://www.codeproject.com/") + strCurDir + _T("/");
strNetDir.MakeLower();
int iStart = 0, iEnd = 0;
iStart = strContant.Find(strStart, iStart);
for (; -1 != iStart; iStart = strContant.Find(strStart, iStart + strStart.GetLength()))
{
bool bEnd = true;
for(int j = 0; bEnd; ++j)
{
strEnd = strContant.Mid(iStart + strStart.GetLength() + j, 1);
bEnd = (strEnd == _T(" ")) || (strEnd == _T("="));
}
if ((_T("\"") != strEnd) && (_T("'") != strEnd)) continue;
iEnd = strContant.Find(strEnd, iStart + strStart.GetLength() + j);
CString strTemp, strItem = strContant.Mid(iStart, iEnd - iStart);
strTemp = strItem;
strTemp.MakeLower();
if (strTemp.Right(strCondition.GetLength()) == strCondition)
{
strItem = strItem.Right(strItem.GetLength() - strStart.GetLength() - j);
strTemp = strItem.Left(strNetDir.GetLength());
strTemp.MakeLower();
if (_T("http://") == strTemp.Left(7))
{
if (strTemp.Left(strCurDir.GetLength()) == strCurDir)
{
strItem = strItem.Right(strItem.GetLength() - strCurDir.GetLength());
pArray->Add(strItem);
}
}
else
{
if (_T("ftp://") != strTemp.Left(6))
pArray->Add(strItem);
}
}
}
return true;
}
// CodeProjectDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CodeProject.h"
#include "CodeProjectDlg.h"
#include "DlgExplain.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_USER_DOWNSTATUS (WM_USER + 101)
#define WM_USER_DOWNCOMPLETE (WM_USER + 102)
/////////////////////////////////////////////////////////////////////////////
// CCodeProjectDlg dialog
bool DownloadHtml(CInternetSession &session, CString &strURL, CString &outStr)
{
//K 下载指定的网页到一个字符串中
CString sHeader = _T("Accept:*/*\r\n");
DWORD dwFlags = INTERNET_FLAG_DONT_CACHE |
INTERNET_FLAG_TRANSFER_BINARY |
INTERNET_FLAG_EXISTING_CONNECT |
INTERNET_FLAG_RELOAD;
int nRead;
char buffer[1024];
try
{
if(strURL.Left(7) != _T("http://")) strURL = _T("http://") + strURL;
CHttpFile *pHttpFile = (CHttpFile*)session.OpenURL(strURL, 1, dwFlags, sHeader, -1L);
if(pHttpFile)
{
do
{
nRead = pHttpFile->Read(buffer, 1023);
if(nRead != 0)
{
buffer[nRead] = 0;
outStr += buffer;
}
} while (nRead != 0);
delete pHttpFile;
}
else
{
AfxMessageBox(_T("建立连接失败:") + strURL);
return false;
}
}
catch (CInternetException *pEx)
{
AfxMessageBox(_T("访问网址时出现异常:") + strURL);
pEx->Delete();
return false;
}
return true;
}
bool ConfirmDir(CString &strDir)
{
//K 确认目录,如果不存在就创建它
if (-1 == _taccess(strDir, 0))
if (!::CreateDirectory(strDir, NULL))
{
AfxMessageBox(_T("创建文件夹失败!") + strDir);
return false;
}
return true;
}
bool DownloadFile(CInternetSession &session, CString &strURL, CString &strFileName)
{
//K 下载指定的文件
CString sHeader = _T("Accept:*/*\r\n");
DWORD dwFlags = INTERNET_FLAG_DONT_CACHE |
INTERNET_FLAG_TRANSFER_BINARY |
INTERNET_FLAG_EXISTING_CONNECT |
INTERNET_FLAG_RELOAD;
int nRead;
char buffer[1024];
CHttpFile *pHttpFile = NULL;
CFile *pFile = NULL;
try
{
if(strURL.Left(7) != _T("http://")) strURL = _T("http://") + strURL;
pHttpFile = (CHttpFile*)session.OpenURL(strURL, 1, dwFlags, sHeader, -1L);
if(pHttpFile)
{
pFile = new CFile;
pFile->Open(strFileName, CFile::modeWrite | CFile::modeCreate);
do
{
nRead = pHttpFile->Read(buffer, 1023);
if(nRead != 0)
{
buffer[nRead] = 0;
pFile->Write(buffer, nRead);
}
} while (nRead != 0);
delete pHttpFile;
pFile->Close();
delete pFile;
}
else
{
AfxMessageBox(_T("建立连接失败:") + strURL);
return false;
}
}
catch (CInternetException *pEx)
{
AfxMessageBox(_T("访问网址时出现异常:") + strURL);
pEx->Delete();
if (NULL != pHttpFile) delete pHttpFile;
if (NULL != pFile) delete pFile;
return false;
}
catch (CFileException * pFEx)
{
AfxMessageBox(_T("写文件时出现异常!") + strURL + _T("->") + strFileName);
pFEx->Delete();
if (NULL != pHttpFile) delete pHttpFile;
if (NULL != pFile) delete pFile;
return false;
}
return true;
}
bool SaveStr2File(CString &inStr, CString &strFileName)
{
//K 将字符串中的内容保存为文件
CFile *pFile = new CFile;
pFile->Open(strFileName, CFile::modeWrite | CFile::modeCreate);
inStr.FreeExtra();
long lStrLen = inStr.GetLength() * sizeof(TCHAR);
pFile->Write((void*)inStr.GetBuffer(lStrLen), lStrLen);
pFile->Close();
delete pFile;
return true;
}
CString CCodeProjectDlg::m_strTargetDir;
CArray CCodeProjectDlg::m_aryDownloadItem;
CArray CCodeProjectDlg::m_aryDownloadItemName;
CCodeProjectDlg::CCodeProjectDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCodeProjectDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCodeProjectDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCodeProjectDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCodeProjectDlg)
DDX_Control(pDX, IDOK, m_btnOK);
DDX_Control(pDX, IDC_EDIT1, m_editStatus);
DDX_Control(pDX, IDC_LIST, m_list);
DDX_Control(pDX, IDC_EDIT_TargetDir, m_editTargetDir);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCodeProjectDlg, CDialog)
//{{AFX_MSG_MAP(CCodeProjectDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_STATIC_WEB, OnStaticWeb)
ON_MESSAGE(WM_USER_DOWNSTATUS, OnDownStatus)
ON_MESSAGE(WM_USER_DOWNCOMPLETE, OnDownComplete)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCodeProjectDlg message handlers
BOOL CCodeProjectDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
CString strItem[] = {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -