Я пытаюсь скопировать папку 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( );
не работает?
Заранее спасибо.
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
(что это). Или что приложение вылетает / выбрасывает, когда оно не работает. Или что файлы скопированы или нет. Это может помочь вам ответить.
Других решений пока нет …