当前位置: 首页 > 知识库问答 >
问题:

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

佟英武
2024-05-31

如题,代码如下:

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个答案

燕青青
2024-05-31

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

 类似资料:
  • 问题内容: 为什么不通用? 好像有 然后,当你不小心尝试从中删除(例如)而不是每个时,这将是编译时错误,而不是以后的调试问题。 问题答案: (Map以及中的)不是通用的,因为你应该能够将任何类型的对象传递给。删除的对象不必与你传递给的对象具有相同的类型;它只要求它们相等。从本说明书中,将删除对象e,使得是true。请注意,没有什么要求,o并且e必须是相同的类型。这是因为该方法接受一个参数,而不仅仅

  • 我有一个包含一些文件路径的长文本。 我想做的是从其中删除路径。文件路径都类似于: 我知道使用“^/all”将选择以/all开头的句子,并选择以.js$结尾的句子。但我无法将这些合并在一起以选择整个文件路径。 毕竟,正则表达式应该放在下面的代码上以删除路径。 我能为它写正则表达式吗?有什么工具吗?

  • 问题内容: 我刚刚在android应用程序中编写了一个函数,该函数使用Java中的标准“文件”类删除文件。即: 尽管上面的过程很简单,但我一直想知道通过“ ContentResolver”执行该操作是否有任何好处。任何意见,将不胜感激。 干杯, 杰瑞德 ------------------------------------------编辑------- 这是通过Content Resolver删

  • 问题内容: 我正在尝试使此函数正常工作,该函数对参数进行请求,然后将responseText发送给该函数。 似乎只能做到(由于Firebug命令)。 这里是: 问题答案: 我解决了分配onload事件而不是onreadystatechange的问题:

  • 问题内容: 链接到示例PDF:单击此处。在这里您可以看到左侧的许多标签已被剪切(由于一些剪切说明) 当我使用PDFTextStripper时,它会打印示例PDF文件中实际剪切/隐藏的所有文本。我已经尝试过这里描述的解决方案,但是它使它变得非常有价值,因为它删除了顶部的许多文本,以及每行开头的一些文本。是否有其他方法可以使用PDFBox仅显示可见字符并跳过所有重叠的字符?也许还有其他工具只能返回可见

  • 我一直在尝试使用HttpSurlConnection与我的服务器进行https连接。代码不断抛出以下异常: java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。 openssl s_client-debug-connect google.com:443