C++ 如何使用“SHFILEOPSTRUCT”
你好 我尝试编写程序来创建和复制一些文件 如果文件夹不存在,当我使用标志 SH.fFlags |=FOF|u沉默 SH.fFlags |=FOF_noconfirmkdir;同时,无法创建文件夹,也无法复制 文件 有人知道为什么吗?谢谢C++ 如何使用“SHFILEOPSTRUCT”,c++,windows,C++,Windows,你好 我尝试编写程序来创建和复制一些文件 如果文件夹不存在,当我使用标志 SH.fFlags |=FOF|u沉默 SH.fFlags |=FOF_noconfirmkdir;同时,无法创建文件夹,也无法复制 文件 有人知道为什么吗?谢谢 CString source; CString target; SHFILEOPSTRUCT SH = { 0 }; SH.hwnd = NULL; SH.wFunc = FO_COPY; SH.fFlags = NULL; SH.fFl
CString source;
CString target;
SHFILEOPSTRUCT SH = { 0 };
SH.hwnd = NULL;
SH.wFunc = FO_COPY;
SH.fFlags = NULL;
SH.fFlags |= FOF_SILENT;
SH.fFlags |= FOF_NOCONFIRMMKDIR;
SH.fFlags |= FOF_NOCONFIRMATION;
SH.fFlags |= FOF_WANTMAPPINGHANDLE;
SH.fFlags |= FOF_NOERRORUI;
source = _T("c:\\Test\\test1\\Test1.exe");
target = _T("C:\\Backup\\Test\\");
source += '\0';
target += '\0';
SH.pTo = target;
SH.pFrom = source;
::SHFileOperation( &SH );
CString不支持嵌入的零。您需要将字符串复制到例如向量:
我不确定这是否是您的代码的唯一问题,但您应该修复它:
CString source;
std::vector<TCHAR> sourceBuffer;
sourceBuffer.resize(source.GetLength()+1);
memcpy( &(sourceBuffer[0]), source.operator LPCTSTR(),
sizeof(TCHAR) * (source.GetLength()+1)); // (1)
sourceBuffer.push_back('\0');
// do the same for target / targetBuffer
SH.pTo = &(targetBuffer[0]);
SH.pFrom = &(sourceBuffer[0]);
1魔术线:
&sourceBuffer[0]是指向我们刚才分配的向量缓冲区的第一个字符的指针,也是memcpy操作的目标
运算符LPCTSTR是对LPCTSTR的显式转换的显式调用,该转换提供memcpy操作的源
source.GetLength+1是字符串的长度(以字符为单位),包括终止的零
SizeOffChar是字符的大小,以字节为单位,在ANSI版本中通常为1,在Unicode版本中为2。memcpy需要字节数,所以我们需要乘以它。
标记[窗口]。如果不正确,请随意重新编辑。这意味着@John已经编辑了你的q,添加了另一个标签,以便让正确的人看到它。这是C++,但是在Linux上工作的人不能帮助Windows标签修改范围。