SHFileOperation требует строки с двойным нулевым символом в конце. Но вы не можете использовать std :: string или std :: wstring для этого. См. Также Двойная строка с нулевым символом в конце .
Когда вы делаете:
currentexepath += "\\subfolder\\*.*\0";
Оператор + строки не видит второе нулевое окончание, потому что останавливается на первом нулевом.
Вот способ, которым вы можете решить это:
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 * и чека в одном утверждении. Когда указатель преобразуется в логическое значение, значение NULL становится ложным, а все остальные значения становятся истинными.