C++ 如何使用“SHFILEOPSTRUCT”

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

你好 我尝试编写程序来创建和复制一些文件

如果文件夹不存在,当我使用标志

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.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标签修改范围。