Двойная кавычка аргумент, переданный в QProcess :: execute? - PullRequest
0 голосов
/ 04 октября 2018

Я создаю символические ссылки в 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, , но он недоступен в MinGW5.3.0 .

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

...