SHFileOperation копирование папок с использованием строк

Я пытаюсь скопировать папку SHFileOperationA функция. Вот мой код

int main()  {

SHFILEOPSTRUCTA sf;
int result;

string source = "D:\\check\\folder4";
string dest = "D:\\Documents\\test\\folder4";

sf.pFrom = source.c_str( );
sf.pTo = dest.c_str( );
sf.wFunc = FO_COPY;
sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SILENT;

result = SHFileOperationA(&sf);

return 0;
}

Я не могу понять, как сделать строку, добавленную \0 дважды.
Я попробовал что-то подобное.

    string source = "D:\\check\\folder4\\0\\0";
string dest = "D:\\Documents\\test\\folder4\\0\\0";

Но это не работает. Я также попробовал еще несколько комбинаций, но ни одна из них не работает. Пожалуйста, кто-нибудь может подсказать мне, как решить эту проблему?

Я могу решить проблему, напрямую назначив пути следующим образом:

    sf.pFrom = "D:\\check\\folder4";
sf.pTo = "D:\\Documents\\test\\folder4";

и проблема решается, но я намерен использовать строки. Пожалуйста, кто-нибудь может мне помочь с этим.

Также, если возможно, кто-нибудь может сказать мне, почему непосредственно присваивается строковая константа, т.е. sf.pFrom = "D:\\check\\folder4"; работает и присваивает с помощью строки, как sf.pFrom = source.c_str( ); не работает?

Заранее спасибо.

3

Решение

std::string делает strlen (или аналогичный), чтобы найти конец массива константных символов и выделить только необходимое количество символов. Таким образом, он останавливается на первом нуле и не копирует другой. Если вы хотите переопределить это, вам нужно использовать конструктор, который принимает размер, например:

string source("D:\\check\\folder4\\0", 18);

Обратите внимание, что второй нулевой символ добавляется автоматически, как и любая другая строка.

Или добавьте нулевой символ в явном виде (способ лучше):

std::string source = std::string("D:\\check\\folder4") + std::string(1, '\0');

Или же

std::string source = "D:\\check\\folder4";
source.append(1, '\0');

Что касается другого вопроса, почему использование константного массива символов работает:

Я считаю, что если это работает, просто удача, что байт / символ в памяти после массива константных символов равен нулю.

Вы можете проверить это самостоятельно (в отладчике или распечатав значения):

// this is the compiler generated null
(*(sf.pFrom + strlen(sf.pFrom))) == '\0'

// this is the following byte/character that should be luckily null
(*(sf.pFrom + strlen(sf.pFrom) + 1)) == '\0'

Если вы обнаружите, что следующий символ не является нулевым в отладчике, убедитесь, что вы закончили отладку до SHFileOperationA, Как и в этом конкретном случае, он может дать сбой / сбой / что угодно (хотя обычно это не так), поскольку сам факт отладки может сделать образ памяти другим.

Также вы не указали, что именно вы подразумеваете под «это работает». Вы имеете в виду результат SHFileOperationA (что это). Или что приложение вылетает / выбрасывает, когда оно не работает. Или что файлы скопированы или нет. Это может помочь вам ответить.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]