错误124- SHFileOperation的系统调用级别不正确

时间:2015-09-23 11:55:01

标签: c++ windows

我想使用SHFileOperation将文件/目录从一个位置复制到另一个位置。 到目前为止,我的代码是,

    for(int index=0; index < clbSource.GetCount();index++ )
    {
        SHFILEOPSTRUCT SHFileOp;
        CString src,dest;
        std::string NULLTermination="\\0\\0";

        //Get source file/directory path from CListBox
        int n = clbSource.GetTextLen(index);
        clbSource.GetText(index, src.GetBuffer(n));
        src.ReleaseBuffer();
        CT2CA pszConvertedAnsiString (src);
        std::string strStdS (pszConvertedAnsiString);

        //replace single slash with double
        size_t found = 0, next = 0;
        while( (found = strStdS.find('\\', next)) != std::string::npos )
        {
        strStdS.insert(found, "\\");
        next = found+4;
        }

        //Add double null termination
        strStdS.append(NULLTermination);   
        std::wstring stempS = s2ws(strStdS);

        //Get source file/directory path from CListBox
        int m = clbDest.GetTextLen(index);
        clbDest.GetText(index, dest.GetBuffer(n));
        dest.ReleaseBuffer();
        CT2CA pszConvertedAnsiStringd (dest);
        std::string strStdD (pszConvertedAnsiStringd);

        //replace single slash with double
        size_t foundD = 0, nextD = 0;
        while( (foundD = strStdD.find('\\', nextD)) != std::string::npos )
        {
        strStdD.insert(foundD, "\\");
        nextD = foundD+4;
        }

        //Add double null termination
        strStdD.append(NULLTermination);   
        std::wstring stempD = s2ws(strStdD);


        //  set up File Operation structure
        ZeroMemory(&SHFileOp, sizeof(SHFILEOPSTRUCT));

        // application the owner of the progress dialog.
        SHFileOp.hwnd = GetSafeHwnd();
        SHFileOp.wFunc = FO_COPY;

        SHFileOp.pFrom = stempS.c_str();
        //SHFileOp.pFrom = _T("E:\\backup\\java softwares\0\0");

        SHFileOp.pTo = stempD.c_str();
        //SHFileOp.pTo = _T("E:\\Tmp\0\0");

        // Set the flags.
        SHFileOp.fFlags = FOF_SIMPLEPROGRESS;

        // Do it.
        DWORD result = SHFileOperation(&SHFileOp);

        //Check for success
        if(result!=0)
        {
        ::AfxMessageBox(ERR_MSG_FAILED_TO_COPY);
        }
        else
            ::AfxMessageBox(SUCCESS);

    }

现在,结果是非零,即124。 也是这个链接System Error 124 - ERROR_INVALID_LEVEL with SHFileOperation。 无法理解问题所在。

注意:如果硬编码的值(如图所示)传递给'SHFileOp.pFrom'和'SHFileOp.pTo',它就没有问题。

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

SHFileOperation不会返回标准的Windows错误代码,因为&#34;历史原因&#34;。

MSDN:SHFileOperation,在&#34;返回值&#34;下列出了可能的结果列表。

  

124 == 0x7C ==源或目标中的路径或两者都无效。

检查您在结构中实际传递的值,这可能是路径转换中的错误。

答案 1 :(得分:1)

首先,std::string NULLTermination="\\0\\0"应为std::string NULLTermination="\0\0"

即使这样,std::string NULLTermination="\0\0";也没有按照你的想法行事。

它会创建一个空字符串。这是因为来自std::string的{​​{1}}的构造函数将您给它的字符串视为以空字符结尾的字符串。它到达第一个n并以那里结束为空字符串,甚至没有看第二个nul。

这有几种方法来创建一个双n终止字符串,可能最简单的是:

char*