【问题标题】:Error using SHFileOperation() to copy a folder使用 SHFileOperation() 复制文件夹时出错
【发布时间】:2021-04-16 20:13:41
【问题描述】:

我正在尝试使用SHFileOperation() 复制文件夹,但出现此错误:

“const char *”类型的值不能分配给“PCZZWSTR”类型的实体

对于s.pTo 和s.pFrom。

我使用的代码是:

SHFILEOPSTRUCT s = { 0 };
s.hwnd = hWnd;
s.wFunc = FO_COPY;
s.fFlags = FOF_SILENT;
s.pTo = "C:\\Users\\styler\\Desktop\\Folder1\0";
s.pFrom = "C:\\Users\\styler\\Desktop\\Software\\Folder2\\Folder3\\*\0";
SHFileOperation(&s);

我在s.pTo 和s.pFrom 中做错了什么?我将它们设置为等于目标文件夹和源文件夹,但是为什么这不起作用?

【问题讨论】:

  • 错误告诉你所有信息。问题是什么?

标签: c++ winapi directory copy shfileoperation


【解决方案1】:

编译器告诉您您正在尝试将 char 字符串文字分配给 wchar_t 字符串指针 (PCZZWSTR = CONST WCHAR *)。这意味着您必须使用定义的UNICODE 进行编译,其中SHFileOperation() 映射到SHFileOperationW(),它需要wchar_t* 字符串指针而不是char* 字符串指针。

因此,您需要在字符串文字前加上 L 前缀,例如:

SHFILEOPSTRUCT s = { 0 };
s.hwnd = hWnd;
s.wFunc = FO_COPY;
s.fFlags = FOF_SILENT;
s.pTo = L"C:\\Users\\styler\\Desktop\\Folder1\0";
s.pFrom = L"C:\\Users\\styler\\Desktop\\Software\\Folder2\\Folder3\\*\0";
SHFileOperation(&s);

或者,由于您实际上使用的是SHFileOperation() 的TCHAR 版本,请使用TEXT() 宏将您的字符串文字与TCHAR 使用的实际字符类型相匹配:

SHFILEOPSTRUCT s = { 0 };
s.hwnd = hWnd;
s.wFunc = FO_COPY;
s.fFlags = FOF_SILENT;
s.pTo = TEXT("C:\\Users\\styler\\Desktop\\Folder1\0");
s.pFrom = TEXT("C:\\Users\\styler\\Desktop\\Software\\Folder2\\Folder3\\*\0");
SHFileOperation(&s);

【讨论】:

  • 消除了错误,但由于某种原因,文件夹没有复制到我指定的位置。
  • 这是一个不同的问题。 SHFileOperation() 返回的实际错误代码是什么?您的应用是否有权访问相关文件夹?
  • 它的意思是“您指定的文件名无效或太长。请指定其他文件名。”
  • 这不是我问的。 SHFileOperation() 返回的错误代码(int 值)是什么? int errCode = SHFileOperation(&s);errCode 的值是多少?但无论如何,在尝试从中复制之前,您是否验证了 C:\Users\styler\Desktop\Software\Folder2\Folder3\ 文件夹确实存在?您是要复制 Folder3 文件夹本身还是其中的文件?
  • @SA1234 我在documentation 中读到:“标准 MS-DOS 通配符,例如“*”,仅允许在文件名位置。在字符串的其他位置使用通配符会导致不可预知的结果。”
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2018-04-19
相关资源
最近更新 更多