前言
- 各位师傅大家好,我是qmx_07,今天对前面的知识,进行小练习

拷贝文件CopyFile
BOOL MyCopyFile(const CHAR* src, const CHAR* det)
{HANDLE hFileSrc = CreateFile(src, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == hFileSrc){cout << GetLastError() << endl;return FALSE;}LARGE_INTEGER FileSize;if (!GetFileSizeEx(hFileSrc, &FileSize)){cout << GetLastError() << endl;return FALSE;}CHAR* Buffer = new CHAR[FileSize.LowPart + 1];memset(Buffer, 0, FileSize.LowPart + 1);DWORD NumRead = 0;BOOL Ret = ReadFile(hFileSrc, Buffer, FileSize.LowPart + 1, &NumRead, NULL);if (!Ret){cout << GetLastError() << endl;return FALSE;}HANDLE hFileDet = CreateFile(det, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);DWORD length = strlen(Buffer);DWORD NumWrite = 0;Ret = WriteFile(hFileDet, Buffer, length, &NumWrite, NULL);if (!Ret){cout << GetLastError() << endl;return FALSE;}CloseHandle(hFileSrc);CloseHandle(hFileDet);return TRUE;
}
- 思路:拷贝文件是读取文件的内容数据,再写入另一个文件,从而完成复制
- 建议手写一下 锻炼一下手敲代码的能力
- 画面演示:

移动文件MoveFile
BOOL MyMoveFile(const CHAR* src , const CHAR* det)
{HANDLE hFileSrc = CreateFile(src, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == hFileSrc){cout << GetLastError() << endl;return FALSE;}LARGE_INTEGER FileSize;if (!GetFileSizeEx(hFileSrc, &FileSize)){cout << GetLastError() << endl;return FALSE;}CHAR* Buffer = new CHAR[FileSize.LowPart + 1];memset(Buffer, 0, FileSize.LowPart + 1);DWORD NumRead = 0;BOOL Ret = ReadFile(hFileSrc, Buffer, FileSize.LowPart + 1, &NumRead, NULL);if (!Ret){cout << GetLastError() << endl;return FALSE;}HANDLE hFileDet = CreateFile(det, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);DWORD length = strlen(Buffer);DWORD NumWrite = 0;Ret = WriteFile(hFileDet, Buffer, length, &NumWrite, NULL);if (!Ret){cout << GetLastError() << endl;}CloseHandle(hFileSrc);CHAR* tempSrc = const_cast<CHAR*>(src);if (!DeleteFile(tempSrc)){DWORD error = GetLastError();cout << "删除文件失败,错误码: " << error << endl;return FALSE;}CloseHandle(hFileDet);return TRUE;
}
- 思路: 其实与CopyFile一样,都是读取文件 写入文件操作,但是 要用DeleteFile函数将原文件清除
- CHAR* tempSrc = const_cast<CHAR*>(src); 将const CHAR* 去除const常量属性,能够修改
- 画面演示:

递归遍历文件函数
BOOL recurseDirectory(const CHAR* src)
{char NewDir[100];strcpy(NewDir, src);strcat(NewDir, "\\*");WIN32_FIND_DATA FindFileData;HANDLE hFind = FindFirstFile(NewDir, &FindFileData);if (INVALID_HANDLE_VALUE == hFind){cout << GetLastError() << endl;return FALSE;}do {if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0 && strcmp(FindFileData.cFileName, ".") != 0 &&strcmp(FindFileData.cFileName, "..") != 0){strcpy(NewDir, src);strcat(NewDir, "\\");strcat(NewDir, FindFileData.cFileName);recurseDirectory(NewDir);}else{if (strcmp(FindFileData.cFileName, ".") != 0 && strcmp(FindFileData.cFileName, "..") != 0){SYSTEMTIME SystemTime;FileTimeToSystemTime(&FindFileData.ftCreationTime, &SystemTime);std::cout << SystemTime.wYear << "-" << SystemTime.wMonth << "-" << SystemTime.wDay << " ";if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){std::cout << "<DIR>" << " ";}std::cout << FindFileData.cFileName << std::endl;}}} while (FindNextFile(hFind, &FindFileData));CloseHandle(hFind);return TRUE;
}
- 通过创建NewDir,利用strcat拼接路径,进行迭代判断输出
- 画面演示:
素材:


删除非空目录
void DeleteDirectory(const std::string& directoryPath)
{WIN32_FIND_DATA findFileData;HANDLE hFind = FindFirstFile((directoryPath + "\\*").c_str(), &findFileData);if (hFind == INVALID_HANDLE_VALUE){return;}do {if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){if (strcmp(findFileData.cFileName, ".") != 0 && strcmp(findFileData.cFileName, "..") != 0){DeleteDirectory(directoryPath + "\\" + findFileData.cFileName);}}else{std::string filePath = directoryPath + "\\" + findFileData.cFileName;DeleteFile(filePath.c_str());}} while (FindNextFile(hFind, &findFileData));FindClose(hFind);RemoveDirectory(directoryPath.c_str());
}
- 使用RemoveDirectory可以删除空目录
- 通过迭代到最里面的目录,删除所有文件,最后进行删除目录
- 画面演示:

总结
- 通过前面的学习,实现了复制,移动,迭代文件,迭代删除目录的功能