为什么通过swprintf_s拼接的路径无法用SHFileOperation删除文件?

如题,代码如下:

WCHAR szPath[MAX_PATH] { L'\0' };
swprintf_s(szPath, MAX_PATH, L"%ls\\abc.txt\0", L"D:");

BOOL ret = PathFileExistsW(szPath);
wprintf(L"%ls exists: %d\n", szPath, ret);

SHFILEOPSTRUCT fileOp;
fileOp.wFunc = FO_DELETE;
fileOp.pFrom = szPath;
fileOp.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;
DWORD dwError = SHFileOperationW(&fileOp);
wprintf(L"%ls delete ret: 0x%08X\n", szPath, dwError);

上述代码输出结果为:
image.png

只有手写路径才能删除成功,如fileOp.pFrom = L"D:\abc.txt\0"
通过swprintf_s拼接的路径字符串则失败

阅读 1.4k
1 个回答

SHFILEOPSTRUCTW (shellapi.h) - Win32 apps | Microsoft Learn

微软官方文档要求SHFILEOPSTRUCTpFrom字段要以双null结尾:
image.png

swprintf_s拼接的字符串只有一个null,如下图:
image.png

因此只需要在字符串结尾再补一个null即可,修改的代码如下:

WCHAR szPath[MAX_PATH] { L'\0' };
int len = swprintf_s(szPath, MAX_PATH, L"%ls\\abc.txt", L"D:");
szPath[len + 1] = L'\0';

BOOL ret = PathFileExistsW(szPath);
wprintf(L"%ls exists: %d\n", szPath, ret);

SHFILEOPSTRUCT fileOp;
fileOp.wFunc = FO_DELETE;
fileOp.pFrom = szPath;
fileOp.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;
DWORD dwError = SHFileOperationW(&fileOp);
wprintf(L"%ls delete ret: 0x%08X\n", szPath, dwError);

最终结果:
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进