Windows 使用 SHFileOperation 实现文件复制功能
SHFileOperation是Windows系统提供的文件操作函数,通过SHFILEOPSTRUCT结构体参数实现文件的复制、删除、移动及重命名等功能。该函数支持FO_COPY(复制)、FO_DELETE(删除)、FO_MOVE(移动)和FO_RENAME(重命名)四种操作类型。
经测试发现,相较于QFile::copy之类,使用SHFileOperation来实现文件复制的功能,在效率上有较大提升,示例代码如下:
void CopyFolder(TCHAR *srcFolder, TCHAR *dstFolder)
{SHFILEOPSTRUCT fop = {0};fop.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR;fop.wFunc = FO_COPY;//fop.pFrom = srcFolder;fop.pTo = dstFolder;SHFileOperation(&fop);
}
改进版本:
#include <shlobj.h>
#include <tchar.h>
#include <strsafe.h>// 返回值:0=成功,非0=错误码
int CopyFolder(LPCTSTR srcFolder, LPCTSTR dstFolder)
{// 验证源路径是否存在if (GetFileAttributes(srcFolder) == INVALID_FILE_ATTRIBUTES) {_tprintf(_T("源路径不存在: %s\n"), srcFolder);return ERROR_FILE_NOT_FOUND;}// 构建带双空终止符的路径TCHAR srcPath[MAX_PATH] = {0};TCHAR dstPath[MAX_PATH] = {0};StringCchCopy(srcPath, MAX_PATH, srcFolder);StringCchCopy(dstPath, MAX_PATH, dstFolder);// 强制添加双空字符(关键修复)srcPath[_tcslen(srcPath) + 1] = _T('\0');dstPath[_tcslen(dstPath) + 1] = _T('\0');SHFILEOPSTRUCT fop = {0};fop.wFunc = FO_COPY;fop.pFrom = srcPath;fop.pTo = dstPath;fop.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR | FOF_SILENT;// 执行操作并检查结果int result = SHFileOperation(&fop);if (result != 0) {_tprintf(_T("复制失败,错误码: 0x%08X\n"), result);return result;}return 0;
}