Comment déterminez-vous les chemins complets des arguments de ligne de commande de nom de fichier dans un programme C ++?

StackOverflow https://stackoverflow.com/questions/2033908

Question

J'écris un programme en C ++ qui accepte un nom de fichier comme argument sur la ligne de commande:

>> ./myprogram ../path/to/file.txt

Je sais que je peux simplement ouvrir un fstream en utilisant argv[1], mais le programme a besoin de plus d'informations sur l'emplacement exact (c.-à-d. Full pathname) du fichier.

J'ai pensé à ajouter argv[1] à getcwd(), Cependant, évidemment, dans l'exemple ci-dessus, vous vous retrouveriez avec /path/../path/to/file.txt. Je ne sais pas si FStream résoudrait automatiquement ce chemin, mais même si c'est le cas, je n'ai toujours pas le chemin complet sans beaucoup de traitement de chaîne.

Bien sûr, cette méthode ne fonctionnerait pas du tout si le chemin fourni était déjà absolu. Et comme ce programme peut être exécuté sur Linux / Windows / etc., détecter simplement un caractère de départ '/' ne fonctionnera pas pour déterminer si l'argument était un chemin complet ou non.

Je pense que c'est un problème assez courant pour traiter les noms de chemin à travers plusieurs OS. Alors Comment retreive le nom de chemin complet d'un argument de ligne de commande et Comment est-ce géré entre les systèmes d'exploitation?

Était-ce utile?

La solution

La manipulation du chemin d'accès est fortement spécifique au système d'exploitation: certains OS ont une hiérarchie avec une seule racine (par exemple / sur Unix), certaines ont plusieurs racines à la lecteur de lecteur de MS-DOS; Certains peuvent avoir des liens symboliques, des liens durs ou d'autres types de liens, ce qui peut rendre la traversée délicate. Certains peuvent même ne pas avoir le concept d'un chemin "canonique" vers un fichier (par exemple, si un fichier a des liens durs, il n'a plusieurs noms, dont aucun n'est plus "canonique").

Si vous avez déjà essayé de faire des manipulations de noms de cheminement sur plusieurs systèmes d'exploitation en Java, vous savez ce que je veux dire :-).

En bref, la manipulation du chemin de chemin est spécifique au système, vous devrez donc le faire séparément pour chaque système d'exploitation (famille), ou utiliser une bibliothèque appropriée.

Éditer:

Tu pourrais regarder APCAChe Portable Runtime, ou sur boost (c ++ cependant), les deux ont des fonctions de manutention de chemin de chemin.

Autres conseils

... vous vous retrouveriez avec /path/../path/to/file.txt. Je ne sais pas si FStream résoudrait automatiquement ce chemin, mais même si c'est le cas, je n'ai toujours pas le chemin complet sans beaucoup de traitement de chaîne.

C'est le cas, et vous pouvez utiliser /path/../path/ pour tout ce que vous voulez sans problèmes.

Quoi qu'il en soit, il n'y a pas de fonction standard en C ++ pour faire ce que vous voulez. Vous devriez le faire manuellement, et ce ne serait pas trivial. Je vous suggère de garder le chemin tel quel, cela ne devrait causer aucun problème.

Il dépend du système d'exploitation. Si vous utilisez Linux, vous pouvez regarder realpath (). Sans aucun doute, Windows a quelque chose de comparable.

Afaik il n'y a pas de moyen standard.

Cependant, vous pouvez essayer cette approche (écrite en pseudocode):

string raw_dirname=get_directory_part(argv[1])
string basename=get_filename_part(argv[1])
string cwd=getcwd()
chdir(relative_dirname)
string absolute_dirname=getcwd()
chdir(cwd)
string absolute_filename=absulute_dirname + separator + basename

Mais note: je ne sais pas trop s'il y a des problèmes lorsque les liens symboliques entrent en jeu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top