// PublicFunction.cpp: implementation of the CPublicFunction class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FileDownThread.h"
#include "PublicFunction.h"
#include <Afxmt.h>
#include <io.h>
#include <direct.h>
#include "log.h"
// for function StrTrim()
#include "Shlwapi.h"
#pragma comment ( lib, "Shlwapi.lib" )
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
const char f_seps[] = ";";
void DeleteStrAry(CStringArray **ppStrAry)
{
if ( ppStrAry && (*ppStrAry) )
{
(*ppStrAry)->RemoveAll();
(*ppStrAry)->FreeExtra();
delete (*ppStrAry);
(*ppStrAry) = NULL;
}
}
int PartStringAndAddToStrAry ( char *pStr, CStringArray &StrAry, char *seps/*="\t\r\n"*/ )
{
StrAry.RemoveAll();
char *token;
token = strtok( pStr, seps );
while( token != NULL )
{
/* While there are tokens in "string" */
StrAry.Add ( token );
/* Get next token: */
token = strtok( NULL, seps );
}
return StrAry.GetSize();
}
int PartStringAndAddToStrAry ( char *pStr, CStringArray &StrAry, char nPartFlag )
{
char *pStart = pStr;
char *pFind = NULL;
char szTempBuf[10240] = {0};
LPCTSTR pszTrimChars = "\r\n\t";
while ( pFind = strchr ( pStart, nPartFlag ) )
{
int nLen = pFind - pStart;
if ( nLen > 0 )
{
if ( nLen > sizeof(szTempBuf)-2 )
nLen = sizeof(szTempBuf)-2;
memcpy ( szTempBuf, pStart, nLen );
szTempBuf [ nLen ] = '\0';
StrTrim ( szTempBuf, pszTrimChars );
StrAry.Add ( szTempBuf );
}
else
{
StrAry.Add ( "" );
}
pStart = pFind + 1;
}
if ( (int)( pStart - pStr ) < (int)strlen ( pStr ) )
StrAry.Add ( pStart );
return StrAry.GetSize();
}
int PartStringAndAddToStrAry ( LPCTSTR lpszStr, CStringArray &StrAry, char nFirstFlag, char nSecondFlag )
{
StrAry.RemoveAll();
int nStartPos = 0, nEndPos = 0;
CString csBigString = GET_SAFE_STRING ( lpszStr );
BOOL bSentence = FALSE;
for ( ;; )
{
char cFindChar = ( bSentence ? nSecondFlag : nFirstFlag );
int nFindPos = csBigString.Find ( cFindChar, nEndPos );
if ( nFindPos < 0 )
{
if ( bSentence )
{
CString csTemp = csBigString.Mid ( nStartPos+1 );
if ( csTemp.GetLength() > 0 )
StrAry.Add ( csTemp );
}
break;
}
if ( !bSentence )
{
nStartPos = nFindPos;
bSentence = TRUE;
}
else
{
nEndPos = nFindPos;
CString csTemp = csBigString.Mid ( nStartPos+1, nEndPos-nStartPos-1 );
StrAry.Add ( csTemp );
bSentence = FALSE;
}
nEndPos = nFindPos + 1;
}
return StrAry.GetSize();
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHwDir::CHwDir(
LPCTSTR lpszBasePathOrFile,
BOOL bSerachSubDir/* = TRUE*/, // 搜索子目录
BOOL bAbsolutePath /*=TRUE*/, // 是绝对路径
CHwDir **ppHwDir/*=NULL*/ // 将这个类的指针传出去给调用者
)
{
m_bCancel = FALSE;
if ( ppHwDir ) *ppHwDir = this;
m_pStrAryResFile = new CStringArray;
if ( !m_pStrAryResFile ) return;
m_pStrArySubDirectory_Private = new CStringArray;
if ( !m_pStrArySubDirectory_Private ) return;
m_pStrArySubDirectory = new CStringArray;
if ( !m_pStrArySubDirectory ) return;
//初始化变量
char buf[MAX_PATH];
m_bSerachSubDir = bSerachSubDir;
m_bAbsolutePath = bAbsolutePath;
m_pStrAryResFile->FreeExtra();
m_pStrArySubDirectory_Private->FreeExtra();
m_pStrArySubDirectory->FreeExtra();
m_dwRelativePathStartPos = 0;
ZeroMemory(m_szBasePathFile,sizeof(m_szBasePathFile));
int iLen = 0;
char *p = NULL;
ZeroMemory(m_strFilter,sizeof(m_strFilter));
m_AmountBytes = 0;
iLen = hwSnprintf((char*)m_szBasePathFile,sizeof(m_szBasePathFile)-2,"%s",lpszBasePathOrFile);
//查找的是目录还是文件,取得目录名和过滤字符(*.*、*.exe、??.cpp等都是过滤条件)
char TempBuf[MAX_PATH];
ZeroMemory(TempBuf,sizeof(TempBuf));
DWORD dwFileAttrib = GetFileAttributes(m_szBasePathFile);
if((dwFileAttrib & FILE_ATTRIBUTE_DIRECTORY) && dwFileAttrib != 0xffffffff) //指定搜索一个目录,没有过滤条件
{
strcpy(m_strFilter,"*.*");
if(m_szBasePathFile[iLen - 1] != '\\')
m_szBasePathFile[iLen] = '\\';
}
else //指定了过滤条件
{
PartFileAndPathByFullPath(m_szBasePathFile,m_strFilter,sizeof(m_strFilter),TempBuf,sizeof(TempBuf));
STRNCPY_SZ( m_szBasePathFile, TempBuf );
}
//找相对路径的位置
if ( !bAbsolutePath )
{
strcpy((char*)buf,(const char*)m_szBasePathFile);
if ( strchr((const char*)buf,':') && strlen((const char*)buf) == 3 ) //是诸如“E:\”、“d:\”的路径
{
m_dwRelativePathStartPos = 3;
}
else if ( strlen((const char*)buf) == 1 && buf[0] == '\\') //是“\”,表示搜索当前盘的根目录
{
m_dwRelativePathStartPos = 1;
}
else //一般目录(绝对路径、相对路径)
{
iLen = (int)strlen((const char*)buf);
buf[iLen - 1] = '\0';
const char *p = strrchr((const char*)buf,'\\');
if(p)
{
m_dwRelativePathStartPos = (DWORD)(p - buf + 1);
}
}
}
Dir();
}
CHwDir::~CHwDir()
{
DeleteStrAry ( &m_pStrAryResFile );
DeleteStrAry ( &m_pStrArySubDirectory_Private );
DeleteStrAry ( &m_pStrArySubDirectory );
}
/********************************************************************************
* Function Type : private
* Parameter : None
* Return Value : 获得的文件总数
* Description : 将目录m_szBasePathFile下的所有文件列举出来
*********************************************************************************/
DWORD CHwDir::Dir()
{
char strDirectory[MAX_PATH*4];
DWORD dwLine = 0;
FindDirAndFile(m_szBasePathFile);
while(1)
{
dwLine = (DWORD)m_pStrArySubDirectory_Private->GetSize();
if(dwLine < 1) break;
//处理m_StrArySubDirectory中最后一个子目录
hwSnprintf((char*)strDirectory,sizeof(strDirectory) - 1,"%s",m_pStrArySubDirectory_Private->GetAt(dwLine - 1));
m_pStrArySubDirectory_Private->RemoveAt(dwLine - 1);
FindDirAndFile(strDirectory);
if ( m_bCancel ) break;
}
return m_pStrAryResFile->GetSize();
}
/********************************************************************************
* Function Type : private
* Parameter : lpszDirectory - 要搜索的纯目录
* Return Value : 获得的文件总数
* Description : 所有一个目录下的所有目录和符合过滤条件的文件
*********************************************************************************/
DWORD CHwDir::FindDirAndFile(LPCTSTR lpszDirectory)
{
DWORD dwRet = 0;
char strDirFile[MAX_PATH*2];
hwSnprintf((char*)strDirFile,sizeof(strDirFile) - 1,"%s*.*",lpszDirectory); //先搜索出子目录
dwRet += FindAllFileUnderOneDir((LPCTSTR)strDirFile,lpszDirectory,TRUE);
hwSnprintf((char*)strDirFile,sizeof(strDirFile) - 1,"%s%s",lpszDirectory,m_strFilter); //再按过滤条件搜索
dwRet += FindAllFileUnderOneDir(strDirFile,lpszDirectory,FALSE);
return dwRet;
}
/********************************************************************************
* Function Type : private
* Parameter : lpszFileName - 要处理的文件(这里把目录也视为文件)
* lpszDirectory - 纯目录(不需要再找目录了,减少计算量)
* bFindDir - 是否只搜索目录,不理会文件
* Return Value : 获得的文件总数
* Description : 查找lpszFileName指定的所有文件或所有目录
*********************************************************************************/
DWORD CHwDir::FindAllFileUnderOneDir(LPCTSTR lpszFileName,LPCTSTR lpszDirectory,BOOL bFindDir)
{
DWORD dwFileNum = 0, dwDirNum = 0;
WIN32_FIND_DATA FindData;
HANDLE hFileHandle = FindFirstFile(lpszFileName,&FindData);
if(hFileHandle == INVALID_HANDLE_VALUE)
return dwFileNum;
int iRet = HandleOneFile ( lpszDirectory, &FindData, bFindDir );
if(iRet == 1) //是文件
dwFileNum ++;
else if(iRet == 2) //是目录
dwDirNum ++;
while ( FindNextFile ( hFileHandle, &FindData ) )
{
iRet = HandleOneFile ( lpszDirectory, &FindDat
没有合适的资源?快使用搜索试试~ 我知道了~
多线程实现文件下载,代码规范明了
共97个文件
h:17个
sbr:16个
cpp:13个
需积分: 10 15 下载量 192 浏览量
2010-03-10
11:01:33
上传
评论
收藏 3.48MB RAR 举报
温馨提示
实现一个能够从网上下载文件的功能,需要多线程来实现。 下载的传输协议采用socket或者http及ftp协议
资源推荐
资源详情
资源评论
收起资源包目录
02FileDownThread.rar (97个子文件)
FileDownThread
Source
FileDownThread.ncb 121KB
ModPublic.cpp 283B
FileDownThread.vcproj.FXF-666888.fxf.user 1KB
DownloadPub.cpp 19KB
FileDownThread.dsp.bak 6KB
FileDownThread.suo 13KB
StdAfx.cpp 212B
FileDownThread.dsw 553B
resource.h 2KB
DownloadFtp.cpp 9KB
FileDownThread.sln 893B
FileDownThread.plg 272B
FileDownThreadDlg.h 4KB
FileDownThread.vcproj 12KB
FileDownThread.clw 2KB
Log.h 2KB
FileDownThread.dsp 6KB
OleListDropTarget.h 1KB
DownloadPub.h 6KB
NetDownMTR.opt 50KB
FileDownThread.aps 60KB
FileDownThread.opt 48KB
FileDownThreadDlg.cpp 24KB
FileDownThreadPool.h 2KB
DownloadHttp.cpp 12KB
GradientProgressCtrl.cpp 13KB
FileDownThread.h 1KB
FileDownThread.rc 7KB
MemDC.h 3KB
NetDownMTR_Debug.ilk 648KB
NetDownMTR.aps 43KB
modpublic.h 439B
PublicFunction.cpp 36KB
NetDownMTR.ncb 97KB
OleListDropTarget.cpp 3KB
GradientProgressCtrl.h 2KB
DownloadMTR.cpp 26KB
StdAfx.h 1KB
Log.cpp 5KB
NetDownHead.h 94B
Config.ini 147B
Release
DownloadPub.obj 31KB
RCa02388 14KB
DownloadFtp.obj 18KB
DownloadMTR.sbr 57KB
DownloadMTR.obj 37KB
NetDownMTR.sbr 130KB
DownloadFtp.sbr 45KB
vc60.idb 65KB
GradientProgressCtrl.sbr 7KB
vc90.idb 611KB
DownloadHttp.obj 25KB
BuildLog.htm 29KB
RCa00552 14KB
FileDownThread.sbr 218KB
RCa01876 14KB
NetDownMTRDlg.sbr 139KB
SocketClient.obj 18KB
DownloadHttp.sbr 46KB
FileDownThread.pch 7.05MB
NetDownMTR.res 24KB
errorlog.ini 48B
PublicFunction.obj 50KB
ModPublic.obj 774B
FileDownThreadDlg.sbr 264KB
DownloadPub.sbr 61KB
ModPublic.sbr 184B
ThreadPool.sbr 121KB
Config.ini 147B
OleListDropTarget.obj 7KB
FileDownThread.obj 10KB
StdAfx.obj 774B
SocketClient.sbr 29KB
FileDownThread.res 24KB
FileDownThreadDlg.obj 73KB
GradientProgressCtrl.obj 28KB
RCa03812 14KB
StdAfx.sbr 1.5MB
OleListDropTarget.sbr 219KB
PublicFunction.sbr 40KB
Log.obj 13KB
Log.sbr 10KB
FileDownThread_Release.exe 108KB
DownloadFtp.h 900B
res
FileDownThread.rc2 402B
FileDownThread.ico 21KB
FileDownThread.cpp 3KB
FileDownThread_Debug.ilk 691KB
DownloadMTR.h 4KB
Config.ini.bak 135B
SocketClient.h 2KB
DownloadHttp.h 1KB
SocketClient.cpp 9KB
PublicFunction.h 8KB
exe
Config.ini 147B
FileDownThread_Release.exe 108KB
多线程实现文件下载demo(附使用说明).doc 82KB
共 97 条
- 1
资源评论
ictfly
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功