2012-02-08 2 views
2

Im пытается скопировать каталог в новое место. Поэтому я использую SHFileOperation/SHFILEOPSTRUCT следующим образом:SHFileOperation/SHFILEOPSTRUCT

SHFILEOPSTRUCT sf; 
memset(&sf,0,sizeof(sf)); 
sf.hwnd = 0; 
sf.wFunc = FO_COPY; 
dirName += "\\*.*"; 
sf.pFrom = dirName.c_str(); 
string copyDir = homeDir + "\\CopyDir"; 
sf.pTo = copyDir.c_str(); 
sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI; 

int n = SHFileOperation(&sf); 
if(n != 0) 
{ 
    int x = 0; 
} 

Так что я установить значения, как указано выше. Файл, который я создал в папке (я закрыл Handle, чтобы он был в порядке). Вызов SHFileOperation возвращает 2, но я не могу найти где-нибудь, где объясняются эти коды ошибок. Кто-нибудь знает, где я могу узнать, что означает 2, или у кого-нибудь есть идеи, почему это может не работать? Cheers

ответ

7

Код ошибки 2 означает Невозможно найти файл указан в системе.

См Windows System Error Codes для полного списка описаний ошибок, или написать функцию, которая будет получать описание для кода ошибки:

std::string error_to_string(const DWORD a_error_code) 
{ 
    // Get the last windows error message. 
    char msg_buf[1025] = { 0 }; 

    // Get the error message for our os code. 
    if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 
         0, 
         a_error_code, 
         0, 
         msg_buf, 
         sizeof(msg_buf) - 1, 
         0)) 
    { 
     // Remove trailing newline character. 
     char* nl_ptr = 0; 
     if (0 != (nl_ptr = strchr(msg_buf, '\n'))) 
     { 
      *nl_ptr = '\0'; 
     } 
     if (0 != (nl_ptr = strchr(msg_buf, '\r'))) 
     { 
      *nl_ptr = '\0'; 
     } 

     return std::string(msg_buf); 
    } 

    return std::string("Failed to get error message"); 
} 

От чтения документации для SHFileOperation строк, указанной для pTo и pFrom должна быть double null terminated: ваш только однократно завершает нуль. Попробуйте следующее:

dirName.append(1, '\0'); 
sf.pFrom = dirName.c_str(); 
string copyDir = homeDir + "\\CopyDir"; 
copyDir.append(1, '\0'); 
sf.pTo = copyDir.c_str(); 
+0

двойной null завершено. Итак, я добавляю \ 0 до конца каждого? – discodowney

+0

В принципе, да. – hmjd

+0

Не имеет значения. Я все еще получаю 2 от SHFileOperation. Обе папки существуют, и в папке pFrom есть файл, поэтому я не знаю, какой файл он не может найти. – discodowney

0

Функция SHFileOperation была заменена в Windows Vista компанией IFileOperation. Так разумно использовать SHFileOperation? Или код работает только на <.

Редактировать: Убрали часть, я неправильно прочитал часть вашего вопроса.

+0

да ив использовал CopyFile Но я хочу, чтобы переместить каталог со всеми файлами, и я знаю, что SHFileOperation может сделать это только с выше кодой (или, вы знаете, с рабочей версией коды выше). Я не знал об IFileOperation. Мне любопытно. Если im в проводнике Windows, и я решил скопировать папку в другое место с помощью клавиатуры/мыши, использует ли это IFileOperation или SHFileOperation? – discodowney