выполнение имен файлов с пробелами в cmd pmt, переданных из программы c++


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

dirIter2->path()

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

system(PathTotal.c_str())

Это работает отлично, но моя единственная проблема заключается в том, что когда имя файла имеет пробел в его имени, командная строка говорит, что он не может найти файл (потому что он думает, что имя файла заканчивается, когда он попадает в первый пробел. Я попытался обернуть его кавычками, но это имя файла acutal, которое нужно обернуть. (напр. я уже пробовал ". C:usersbobjohn это круто", но это должно быть так: C:usersbob"Джон Крут")

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

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

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

Спасибо

3 4

3 ответа:

Как в 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");

Я не знаком со строковыми операциями 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.

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

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

Или

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