Заключить в двойные кавычки аргумент, переданный QProcess :: execute?

Я создаю символические ссылки в 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?

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

G.M. 04.10.2018 15:18

Я уже пробовал использовать setNativeArguments, но, похоже, он не работает с QProcess:execute (или я делаю это неправильно).

bur 04.10.2018 15:39
QProcess::execute - статический член, поэтому нет возможности (насколько мне известно) использовать его вместе с QProcess::setNativeArguments. Вместо этого вам нужно использовать QProcess::start.
G.M. 04.10.2018 15:49

Это то, о чем я думал. Однако я бы хотел избежать использования start. execute предлагает очень простой способ дождаться результата.

bur 04.10.2018 15:52

Почему вы используете QProcess, то есть cmd.exe с внутренней командой mklink? Почему вы не используете в своем коде C++ функцию библиотеки ядра Windows, которую cmd.exe использует для создания символической ссылки - CreateSymbolicLink? См. Также Qt5, символическая ссылка на папку и Qt создать ссылку между папками.

Mofi 04.10.2018 19:14
CreateSymbolicLink недоступен в версии MinGW, которую я, к сожалению, использую. Насколько я понимаю, эти две ссылки не дают никаких других ответов (кроме того, что предложил @GM.).
bur 04.10.2018 21:04

Если все дело в утилитах файловой системы, как насчет boost :: filesystem? Это вариант?

G.M. 04.10.2018 21:12

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

bur 05.10.2018 14:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
778
0

Другие вопросы по теме