Как пользоваться "SHFILEOPSTRUCT" - PullRequest
1 голос
/ 19 ноября 2010

Здравствуйте, я пытаюсь написать программу для создания и копирования некоторых файлов.

Если папки не существует, когда я использую флаг

"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 голосов
/ 20 ноября 2010

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) - это размер символа в байтах (обычно 1 в сборках ANSI, 2 в сборках Unicode). memcpy ожидает количество байтов, поэтому нам нужно умножить на это.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...