Я пытаюсь скопировать содержимое диска A в папку C: \ test \ disk1. Папка disk1 уже существует. Программа компилируется, но при запуске выдается ошибка 87. Я знаю, что ошибка 87 как-то связана с неверным параметром, но я не уверен, в чем проблема. У кого-нибудь есть идеи?
#include <Windows.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
const wchar_t *const sourceFile = L"A:\\";
const wchar_t *const outputFile = L"C:\\test\\disk1";
SHFILEOPSTRUCTW fileOperation;
memset(&fileOperation, 0, sizeof(SHFILEOPSTRUCTW));
fileOperation.wFunc = FO_COPY;
fileOperation.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR |
FOF_NOERRORUI | FOF_FILESONLY;
fileOperation.pFrom = sourceFile;
fileOperation.pTo = outputFile;
int result = SHFileOperationW(&fileOperation);
if (result != 0)
{
printf("SHFileOperation Failure: Error%u\n", result);
return 1;
}
memset(&fileOperation, 0, sizeof(SHFILEOPSTRUCTW));
printf("OK\n");
return 0;
}
Обратите внимание на документацию SHFILEOPSTRUCT и, в частности, pFrom
а также pTo
:
PCZZTSTR pFrom;
PCZZTSTR pTo;
Что значит PCZZTSTR
имею в виду?
pFrom Type: PCZZTSTR Note This string must be double-null terminated.
Таким образом, ваше исправление заключается в предоставлении дополнительного конечного нуля.
const wchar_t *const sourceFile = L"A:\\\0";
const wchar_t *const outputFile = L"C:\\test\\disk1\0";
Обратите внимание, что функции Windows API принимают /
в качестве разделителя каталогов, так что это может быть записано как немного легче для чтения:
const wchar_t *const sourceFile = L"A:/\0";
const wchar_t *const outputFile = L"C:/test/disk1\0";
(PCZZSTR
на самом деле это указатель на список строк с нулевым символом в конце, который заканчивается пустой строкой.)
Других решений пока нет …