#include "CopyFileThread.h"
#include <shlwapi.h>
#include <shlobj.h>
RecycleBin g_RecycleBin; // 回收池
MemPool g_MemPool; // 内存池
//ParamIndex g_ParamIndex;
vector<HANDLE> g_WorkPool; // 工作池
vector<CopyFileThread*> g_ThreadObjs;
HANDLE hIOCompPort;
HANDLE hSemaphore;
DWORD pageSize = 0;
LPHANDLE lpHandle = NULL;
DWORD WINAPI ThreadProc(LPVOID lpParameter);
void Initialize()
{
// 获取系统页面大小
SYSTEM_INFO sysInfo;
ZeroMemory(&sysInfo,sizeof(SYSTEM_INFO));
GetSystemInfo(&sysInfo);
pageSize = sysInfo.dwPageSize;
hIOCompPort = NULL;
hSemaphore = CreateSemaphore(NULL,500,500,NULL);
}
void CopyTotalDir(string strSour,string strDesc)
{
WIN32_FIND_DATA dataFind;
bool bMoreFiles = true;
string strSearchPath = strSour + "\\*.*";
HANDLE hFind = FindFirstFile(strSearchPath.c_str(),&dataFind);
while(hFind != INVALID_HANDLE_VALUE && bMoreFiles == true)
{
string strSourPath,strDesPath;
strSourPath = strSour+ "\\" + dataFind.cFileName;
strDesPath = strDesc + "\\" + dataFind.cFileName;
if(dataFind.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)
{
if (dataFind.nFileSizeHigh != 0 || dataFind.nFileSizeLow > 0x7FFFFFFF)
{
cout << "文件 "<< strSourPath << "超过2G,暂不支持复制!" << endl;
bMoreFiles = FindNextFile(hFind,&dataFind);
continue;
}
CopyFileThread* pThread = new CopyFileThread(strSourPath,strDesPath,ThreadProc);
pThread->StartThread();
//g_WorkPool.push_back(*pThread);
g_ThreadObjs.push_back(pThread);
WaitForSingleObject(*pThread,INFINITE);
}
else if (dataFind.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY && strcmp(dataFind.cFileName,".") && strcmp(dataFind.cFileName,".."))
{
if (!CreateDirectory(strDesPath.c_str(),NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
{
cout << "创建目的目录失败!" << endl;
return;
}
CopyTotalDir(strSourPath,strDesPath);
}
bMoreFiles = FindNextFile(hFind,&dataFind);
}
}
int main(int argc, char ** argv)
{
Initialize();
if (argc != 2)
{
cout << "参数错误!按任意键退出...." << endl;
system("pause");
return 1;
}
//char strSour[MAX_PATH] = {0};
char strDes[MAX_PATH] = {0};
cout << "请输入目的目录地址(绝对路径,可以不存在):\n";
//cin >> strSour;
cin >> strDes;
if (!PathFileExists(argv[1]))
{
cout << "指定的源目录不存在!" << endl;
system("pause");
return 1;
}
if (!PathFileExists(strDes) && SHCreateDirectoryEx(NULL,strDes,NULL) != ERROR_SUCCESS )
{
cout << "创建目的目录失败!" << endl;
system("pause");
return 1;
}
time_t begin = time(NULL);
CopyTotalDir(argv[1],strDes);
/*if (g_WorkPool.empty())
{
cout << "没有工作可做!" << endl;
CloseHandle(hIOCompPort);
return 1;
}
WaitForMultipleObjects(g_WorkPool.size(),&g_WorkPool[0],true,INFINITE);*/
time_t end = time(NULL);
cout << "耗时 " << end - begin << "秒!";
CloseHandle(hIOCompPort);
system("pause");
return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
pParam param = (pParam)lpParameter;
BOOL bSuccess;
DWORD bytesTransferred;
DWORD key;
LPOVERLAPPED overlappedComp;
PBUFFER_DATA pBufferData;
bSuccess = GetQueuedCompletionStatus(hIOCompPort, &bytesTransferred,&key, &overlappedComp,(DWORD)-1);
if( !bSuccess && (overlappedComp == NULL))
{
cout<<"::GetQueuedCompletionStatus Failed::"<<endl;
ExitThread(-1);
}
pBufferData = (PBUFFER_DATA)overlappedComp;
if (bytesTransferred == 0)
{
//free(pBufferData->lpData);
cout<<"::GetQueuedCompletionStatus Failed:: 严重错误!!"<<endl;
return 1;
}
DWORD dwTemp = (bytesTransferred + pageSize - 1) & ~(pageSize-1);
if (dwTemp > bytesTransferred)
{
memset(((char*)(pBufferData->lpData)) + bytesTransferred ,' ',dwTemp - bytesTransferred);
}
::ResetEvent(pBufferData->overLapped.hEvent);
bSuccess = WriteFile(param->hDestination, pBufferData->lpData,dwTemp,&dwTemp,&pBufferData->overLapped);
if (!bSuccess)
{
if (GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(pBufferData->overLapped.hEvent,INFINITE);
}
else
{
cout<<"::Error While Writing File::"<<endl;
}
}
/*pParam pThisParam = g_ParamIndex.FindParam(key);
if (pThisParam == NULL)
{
cout << "严重错误,在全局参数表中找不到指定参数!" << endl;
Beep(1,232);
return 0;
}
ReleaseSemaphore(hSemaphore,1,NULL);*/
g_RecycleBin.AddRecyclerIndex(pBufferData->iIndex);
param->CheckOver(bytesTransferred);
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
IO_Completion.rar_IO_Completion_completion_内存池_完成端口
共34个文件
obj:4个
manifest:3个
user:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 156 浏览量
2022-09-19
15:32:05
上传
评论
收藏 5.64MB RAR 举报
温馨提示
1.使用完成端口复制大文件,速度非常快 2.维护了一个内存池,最大限度的提高复制速度。 3.支持整个目录的复制。
资源推荐
资源详情
资源评论
收起资源包目录
IO_Completion.rar (34个子文件)
IO_Completion
Release
CopyFileThread.obj 88KB
BuildLog.htm 6KB
IOCompletion.exe 156KB
IOCompletion.obj 196KB
IOCompletion.exe.intermediate.manifest 145B
mt.dep 67B
vc80.idb 475KB
IOCompletion.vcproj 5KB
IOCompletion.H 3KB
IOCompletion.dsp 4KB
IOCompletion.suo 72KB
IOCompletion.vcproj.YC.ThinkPad.user 1KB
CopyFileThread.cpp 4KB
CopyFileThread.h 1022B
IOCompletion.dsw 547B
IOCompletion.vcproj.LOVETRACY.ThinkPad.user 1KB
IOCompletion.ncb 13.24MB
IOCompletion.sln 888B
Debug
CopyFileThread.obj 271KB
BuildLog.htm 9KB
IOCompletion.exe.embed.manifest 146B
CopyFileThread.sbr 0B
IOCompletion.sbr 0B
IOCompletion.exe.embed.manifest.res 212B
IOCompletion.obj 586KB
IOCompletion.exe.intermediate.manifest 145B
mt.dep 67B
IOCompletion.ilk 1.66MB
IOCompletion.bsc 4.41MB
vc80.pdb 460KB
vc80.idb 1.15MB
IOCompletion.pdb 3.32MB
IOCompletion.cpp 4KB
IOCompletion.vcproj.YC-PC.ThinkPad.user 1KB
共 34 条
- 1
资源评论
周楷雯
- 粉丝: 78
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功