您好 我尝试编写程序来创建和复制一些文件。
如果文件夹不存在,我使用标志
“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 );
答案 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
是字符串的长度,包括终止零