2010-11-14 1 views
4

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

dirIter2->path()

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

system(PathTotal.c_str())

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

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

Есть ли команда boost, которая могла бы получить путь enitre к файлу без получения файла?

Я не поручены к этой идее, если кто имеет какие-либо лучше предложения

Благодарности

+0

Invalid предположение - это прекрасно работает со ссылкой на все это. Не нужно вдаваться в крайности, чтобы процитировать наименьшую возможную часть. Cheers & hth., –

+0

@Alf - я пробовал процитировать всю строку - по какой-то причине она не работает, у меня была такая же проблема с программным путем, пока я просто не поставил кавычки, где были пробелы. Спасибо за комментарий – Johnston

+1

@ Jonston: Я подозреваю, что вы сделали что-то не так. Например, цитируя «всю строку», включая аргументы. Или, не понимая о '\' 'в C++, или что-то в этом роде. Попробуйте воспроизвести проблему в абсолютно минимальной, но полной программе. Отправьте код, если процесс создания этой программы не решает проблему для вас. он действительно решает проблему, скажите :.-) –

ответ

1

В обоих случаях 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

Я не знаком с 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.

+0

Я не буду пытаться это сделать, поскольку я не могу понять это. Слишком много ошибочных предположений, что я вижу в cna. Например, разделитель путей \ not/(см. пример «C: \ users \ ...»). Однако разделитель путей часто встречается и в аргументах: «C: \ Program Files \ MyApp \ MyApp.exe» «C: \ Documents and Settings \ Bob \ My Documents \ January.MyApp "' - обратите внимание, что вам может потребоваться указать имя и аргумент программы. – MSalters

+0

Он не спрашивал про цитирование пути программы, просто имя. Если он хотел процитировать путь, а также его тривиальное дополнение к тому, что я написал здесь. Но да, я испортил разделитель путей, я исправлю это сейчас. – JohnS

0

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

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

или

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

Смежные вопросы