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

Например, я вызываю свой исполняемый файл в 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)?

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


person js0823    schedule 04.04.2011    source источник


Ответы (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;
}

Посмотреть на Ideone.

person Xeo    schedule 04.04.2011

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

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

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

person Random832    schedule 04.04.2011
comment
Это правильное решение. Нет необходимости преобразовывать в абсолютный путь, если вы не будете вызывать chdir для изменения рабочего каталога. - person R.. GitHub STOP HELPING ICE; 05.04.2011

 man -S3 dirname

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

person sehe    schedule 04.04.2011

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

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#absolutePath

person Dat Chu    schedule 04.04.2011