【发布时间】:2018-09-21 09:48:06
【问题描述】:
我正在尝试将 CString 转换为 LPCWSTR 并且效果很好。但是在处理代码时出了点问题。
我想将一个目录复制到另一个路径,所以我使用SHFILEOPSTRUCT:
HWND console = GetConsoleWindow();
SHFILEOPSTRUCT s = { 0 };
s.hwnd = console;
s.wFunc = FO_COPY;
s.fFlags = FOF_SILENT;
CString _folderName("a6_töüst-Oa5Z.OZS-CI5O5235"),
firstPath("C:\\ORTIM-Daten\\a5Pc 2.0.3\\Temp\\"),
lastPart("\\Documents\\*\0"),
firstPathDest("C:\\ORTIM-Daten\\a5Pc 2.0.3\\"),
lastPartDest("Documents\\"),
_folderNameDest("a6_töüst-Oa5Z.OZS-CI5O5235\0");
CString cstrTemp = firstPath + _folderName + lastPart,
cstrTempDest = firstPathDest + lastPartDest + _folderNameDest;
s.pTo = cstrTempDest /*_TEXT("C:\\ORTIM-Daten\\a5Pc 2.0.3\\Documents\\a6_töüst-Oa5Z.OZS-CI5O5235\0")*/;
s.pFrom = cstrTemp /*_TEXT("C:\\ORTIM-Daten\\a5Pc 2.0.3\\Temp\\a6_töüst-Oa5Z.OZS-CI5O5235\\Documents\\*\0")*/;
SHFileOperation(&s);
当我直接使用CString 时,复制操作不起作用,但是当我使用_TEXT() 宏(如在cmets 中)分配结构中的LPCWSTR 成员时,一切正常。
编辑 1
在源路径和目标路径的两种变体中,代码都会编译。
在这个变体中,代码编译并执行复制操作:
s.pTo = _TEXT("C:\\ORTIM-Daten\\a5Pc 2.0.3\\Documents\\a6_töüst-Oa5Z.OZS-CI5O5235\0");
s.pFrom = _TEXT("C:\\ORTIM-Daten\\a5Pc 2.0.3\\Temp\\a6_töüst-Oa5Z.OZS-CI5O5235\\Documents\\*\0");
在我实际需要的另一个变体中,代码也可以编译,但不会发生复制操作:
s.pTo = cstrTempDest;
s.pFrom = cstrTemp;
【问题讨论】:
-
这里可以正常工作,但你可以试试 cstrTempDest.GetBuffer(0)
-
@ServeLaurijssen 建议复制操作不起作用。在这种情况下,只有创建目标目录(如果它不存在)有效。这意味着,该结构可以读取目标路径“s.pTo”,但由于某种原因无法执行复制操作!
-
这个项目是 UNICODE 还是 ANSI?您的 CString 是
wchar_t变体吗?如果你有一个非 UNICODE 项目,你需要在这里MultiByteToWideChar。 -
@ServeLaurijssen
GetBuffer(0)是错误的方法,因为它不能保证字符串以零结尾。请改用Data()。 -
你为什么首先使用 ANSI 文本?从修复它开始。
标签: c++ string winapi mfc null-terminated