1

これにより、デスクトップに新しいフォルダーが作成されますが、フォルダー .pfrom の内容はフォルダー .pTo に移動されません。

int main()
{

    SHFILEOPSTRUCT sf = {0};
    TCHAR myt[MAX_PATH];
    GetModuleFileName(NULL, myt, MAX_PATH); // puts the currente exe path in the buffer myt
    string currentexepath;
    int i;

    for(i = 0; myt[i] != NULL; i++) {  // this loop is for converting myt to string
        currentexepath += myt[i];      // because string capabilities are needed
    }

    i = currentexepath.find_last_of("\\/");
    currentexepath = currentexepath.substr(0, i);
    currentexepath += "\\subfolder\\*.*\0"; //i tried with and without *.* and \0
    wstring ws = s2ws(currentexepath);

    sf.wFunc = FO_COPY;
    sf.hwnd = 0;
    sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI;
    sf.pFrom = ws.c_str();
    sf.pTo = L"C:\\Users\\Me\\Desktop\\folder\0";
    SHFileOperation(&sf);
}

// the following is from msdn
// http://social.msdn.microsoft.com/Forums/en/Vsexpressvc/thread/0f749fd8-8a43-4580-b54b-fbf964d68375
wstring s2ws(const string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}
4

1 に答える 1

2

SHFileOperationには、二重のnullで終了する文字列が必要です。ただし、そのためにstd::stringまたはstd::wstringを使用することはできません。Doublenullで終了する文字列も参照してください。

あなたがするとき:

currentexepath += "\\subfolder\\*.*\0";

文字列の+演算子は、最初のnullで停止するため、2番目のnull終了を認識しません。

これを解決する方法は次のとおりです。

int main()
{
    SHFILEOPSTRUCT sf = {0};
    TCHAR myt[MAX_PATH];
    GetModuleFileName(NULL, myt, MAX_PATH); // puts the currente exe path in the buffer myt
    string currentexepath;

    if(TCHAR* LastSlash = _tcsrchr(myt, _T('\\'))) {
        *LastSlash = _T('\0');
    }

    // the pipe sign will be replaced with a \0 to get double null termination
    // because _tcscat_s and all other strcat functions stop at the first \0
    // we have to use this workaround
    _tcscat_s(myt, _T("\\subfolder\\*.*|")); 
    while (TCHAR* ptr = _tcsrchr(myt, _T('|'))) {
        *ptr = _T('\0'); 
    }

    sf.wFunc = FO_COPY;
    sf.hwnd = 0;
    sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI;
    sf.pFrom = myt;
    sf.pTo = L"C:\\Users\\wh\\Desktop\\folder\0";
    if(SHFileOperation(&sf)!=0) {
        // error occured
        MessageBox(NULL, L"SHFileOperation failed", L"Error", MB_OK);
    }
}

if()およびwhile()ステートメントはどのようにブール値に変換されますか?

たとえば、次のifステートメント:

    if(TCHAR* LastSlash = _tcsrchr(myt, _T('\\'))) {
        *LastSlash = _T('\0');
    }

次のように書くこともできます:

    TCHAR* LastSlash = _tcsrchr(myt, _T('\\'));
    if(LastSlash) {
        *LastSlash = _T('\0');
    }

また:

    TCHAR* LastSlash = _tcsrchr(myt, _T('\\'));
    if(LastSlash != NULL) {
        *LastSlash = _T('\0');
    }

TCHAR*の割り当てとチェックを1つのステートメントにまとめました。ポインタがブール値に変換されると、NULLはfalseになり、他のすべての値はtrueになります。

于 2011-04-24T10:36:24.103 に答える