discodowney
discodowney

Reputation: 1507

SHFileOperation/SHFILEOPSTRUCT

Im trying to copy a directory to a new location. So I am using SHFileOperation/SHFILEOPSTRUCT as follows:

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

So I set the values as above. There is a file I created in the folder (I have closed the Handle so it should be fine to move). The SHFileOperation call is returning 2, but I cant find anywhere where these error codes are explained. Does anyone know where I can find out what 2 means, or does anyone have any ideas why it might not be working? Cheers

Upvotes: 2

Views: 6724

Answers (1)

hmjd
hmjd

Reputation: 122011

Error code 2 means The system cannot find the file specified.

See Windows System Error Codes for full listing of error descriptions, or write a function that will obtain the description for the error code:

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

From reading the documentation for SHFileOperation the strings specified for pTo and pFrom must be double null terminated: yours are only singly null terminated. Try the following:

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

Upvotes: 7

Related Questions