выполнение имен файлов с пробелами в cmd pmt Передано из программы на c ++ - PullRequest
4 голосов
/ 15 ноября 2010

В настоящее время я работаю над тем, чтобы заставить мою программу выполнять программу (например, power point), а затем рядом с ней путь к файлу, который я хочу открыть. Моя программа получает путь к файлу, используя:

dirIter2->path()

Я получаю 2 пути программы и файла, объединяю их в одну строку и передаю в следующее:

system(PathTotal.c_str())

это работает отлично, но моя единственная проблема заключается в том, что когда имя файла содержит пробел в его имени, командная строка говорит, что не может найти файл (потому что считает, что имя файла заканчивается, когда он попадает в первый пробел. Я пытался обернуть его в кавычки, но это должно быть точное имя файла, которое нужно обернуть. (например, я пробовал "C: \ users \ bob \ john is cool", но это должно быть так: C: \ users \ bob \ "john is cool")

У кого-нибудь есть предложения, как мне это исправить? Я думал о том, чтобы получить путь к папке, где находится файл, а затем получить имя файла. Я бы заключил имя файла в кавычки, а затем добавил его в путь к папке. Я пытался использовать -> path (), как описано выше, но единственная проблема заключается в том, что он выходит только за пределы каталога папки?

Существует ли команда boost, которая может получить путь к файлу enitre без получения файла?

Я не привержен этой идее, если у кого-то есть предложения получше

Спасибо

Ответы [ 3 ]

1 голос
/ 15 ноября 2010

И в C, и в C ++ символ '\' является escape-символом.Для определенных вещей (например, \ n или \ t) он вставляет управляющий код;в противном случае он просто дает вам следующий символ.

Поэтому, если вы сделаете что-то вроде:

fopen("C:\users\bob\john is cool", "r");

, он попытается открыть файл с именем

C:usersbobjohn is cool

Если вы хотите, чтобы эти символы отображались в выходных данных, вы должны их избежать.Итак, вы хотите:

fopen("C:\\users\\bob\\john is cool", "r");

В Windows с Visual Studio я также успешно использовал разделители в стиле Unix:

fopen("C:/users/bob/john is cool", "r");

И на самом деле вы можете смешивать их:

fopen("C:/users\\bob/john is cool", "r");
0 голосов
/ 16 ноября 2010

Я также хотел бы добавить, что иногда необходимо избегать пробелов, как показано ниже:

cmd.exe -C C:/Program\ Files/Application\ Folder/Executable\ with\ spaces.exe

или

cmd.exe -C C:\\Program\ Files\\Application\ Folder\\Executable\ with\ spaces.exe

0 голосов
/ 15 ноября 2010

Я не знаком с операциями со строками C, но не могли бы вы сделать следующее довольно легко?

int i = path.lastIndexOf("\\"); //Find the index of the last "\"
String quotedPath = path.substring(0, i+1); //Get the path up until the last "\"
quotedPath += "\"" + path.substring(i+2) + "\""; //Add quotes and concatenate the filename

Извините за Java, это самая близкая вещь, с которой я знаком. Я сделал это вики-сообществом на случай, если кто-то сможет отредактировать код до эквивалентного C.

...