Я создаю символические ссылки в Windows с помощью QProcess:
QStringList mklink = { "/c", "mklink" };
if (QFileInfo(src).isDir()) mklink << "/d";
mklink << dst << src;
if (QProcess::execute("cmd", mklink) == 0) result = SUCCESS;
Это работает правильно, если аргумент / путь не содержит специальных символов. Это также работает, когда аргумент / путь содержит специальные символы а также, пробелы, потому что аргумент правильно заключен в двойные кавычки QProcess.
Проблема в том, что этого не происходит, когда аргумент / путь не содержит пробелы и, следовательно, никакие специальные символы не экранируются.
Я пробовал вручную добавлять двойные кавычки:
if (!path.contains(" ")) path.append("\"").prepend("\"");
-also tried-
if (!path.contains(" ")) path.append('"').prepend('"');
Но в обоих случаях на выходе получается \C:\path\without\space\. Первая и последняя обратная косая черта - это escape-символ из добавленных двойных кавычек.
Одна альтернатива - использование QProcess::setNativeArguments():
QProcess cmd(this);
QString mklink = "/c mklink";
if (QFileInfo(src).isDir()) mklink += " /d";
mklink += " \""+dst+"\" \""+src+"\"";
cmd.setNativeArguments(mklink);
cmd.start("cmd");
if (cmd.waitForFinished() && cmd.exitStatus() == QProcess::NormalExit && cmd.exitCode() == 0)
result = SUCCESS;
Это работает, но я хотел бы придерживаться QProcess::execute, потому что я могу использовать его статически.
Самый простой способ - использовать WinAPI CreateSymbolicLinkA, но он недоступен в MinGW 5.3.0.
Подводя итог, мой вопрос: как правильно заключить в двойные кавычки аргумент, переданный в QProcess::execute?
Я уже пробовал использовать setNativeArguments, но, похоже, он не работает с QProcess:execute (или я делаю это неправильно).
QProcess::execute - статический член, поэтому нет возможности (насколько мне известно) использовать его вместе с QProcess::setNativeArguments. Вместо этого вам нужно использовать QProcess::start.
Это то, о чем я думал. Однако я бы хотел избежать использования start. execute предлагает очень простой способ дождаться результата.
Почему вы используете QProcess, то есть cmd.exe с внутренней командой mklink? Почему вы не используете в своем коде C++ функцию библиотеки ядра Windows, которую cmd.exe использует для создания символической ссылки - CreateSymbolicLink? См. Также Qt5, символическая ссылка на папку и Qt создать ссылку между папками.
CreateSymbolicLink недоступен в версии MinGW, которую я, к сожалению, использую. Насколько я понимаю, эти две ссылки не дают никаких других ответов (кроме того, что предложил @GM.).
Если все дело в утилитах файловой системы, как насчет boost :: filesystem? Это вариант?
Я полагаю, но я бы использовал его только для этого конкретного случая, поэтому мне лучше просто использовать QProcess:start





Вероятно, вам стоит взглянуть на комментарии, относящиеся к
Windows, в документацииQProcess::start.