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

Например, я вызываю свой исполняемый файл в Ubuntu:

./foo temp / game1.txt temp / game2 txt

Я использую realpath(), чтобы найти путь к game1.txt. Однако его использование даст мне полный путь, включая название game1.txt. Например, это выйдет как

/ home /*/ Download/temp/game1.txt

Я хочу стереть game1.txt в этой строке, чтобы я мог использовать эту строку, чтобы использовать ее для вывода других файлов в этой папке. Два вопроса

  1. Можно ли использовать realpath() для такого рода операций? Есть ли лучший способ?
  2. Может кто-нибудь дать мне быстрый способ стереть "game1.txt", чтобы строка была "/ home /*/ Download / temp /" сохранена в формате строки (не char)?

Большое спасибо.

4 ответа

Решение

На самом деле я не знаю Linux, но общий способ для вашего второго вопроса:

#include <string>
#include <iostream>

int main(){
  std::string fullpath("/home/*/Download/temp/game1.txt");
  size_t last = fullpath.find_last_of('/');
  std::string path = fullpath.substr(0,last+1);

  std::cout << path;
}

Смотри на Идеоне.

Для этого вы можете использовать функцию dirname: http://linux.die.net/man/3/dirname

Обратите внимание, что dirname сотрет косую черту (кроме корневого каталога); вам придется добавить косую черту обратно при добавлении имени файла.

Кроме того, вам на самом деле не нужно использовать realpath для этой цели, вы можете просто использовать переданный аргумент, dirname даст вам "temp", и вы можете добавить к нему имена файлов.

Кроссплатформенное решение

QFileInfo target_file_name(argv[1]);
QString absolute_path = target_file_name.absolutePath() 
// e.g. /home/username/

QString some_other_file = QString("%1/another_file.txt").arg(absolute_path) 
// => /home/username/another_file.txt

Boost.Filesystem также может легко это сделать. Я просто нахожу документацию QFileInfo легко ориентироваться.

http://doc.qt.nokia.com/4.6/qfileinfo.html

 man -S3 dirname

должен делать то, что ты хочешь

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