如何使用“SHFILEOPSTRUCT”

时间:2010-11-19 19:47:40

标签: c++ windows

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

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

“SH.fFlags | = FOF_SILENT;

SH.fFlags | = FOF_NOCONFIRMMKDIR;“同时,无法创建文件夹且无法复制 文件。

任何人都知道为什么?谢谢。

 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 );

1 个答案:

答案 0 :(得分:0)

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操作的目标
  • source.operator LPCTSTR()显式调用(否则隐式)转换为LPCTSTR,它提供了memcpy操作的来源
  • source.GetLength() + 1是字符串的长度,包括终止零
  • sizeof(TCHAR)是以字节为单位的字符大小(ANSI构建中通常为1,Unicode构建中为2)。 memcpy需要字节数,所以我们需要乘以它。