C ++ – Division du nom de fichier et de l’extension de fichier

Ok, tout d’abord je ne veux pas utiliser Boost, ni de bibliothèques externes. Je veux juste utiliser la bibliothèque standard C ++ . Je peux facilement séparer des chaînes avec un délimiteur donné avec ma fonction split() :

 void split(std::ssortingng &ssortingng, std::vector &tokens, const char &delim) { std::ssortingng ea; std::ssortingngstream stream(ssortingng); while(getline(stream, ea, delim)) tokens.push_back(ea); } 

Je le fais sur les noms de fichiers. Mais il y a un problème. Il y a des fichiers qui ont des extensions comme: tar.gz , tar.bz2 , etc. Il y a aussi des noms de fichiers qui ont des points supplémentaires. Some.file.name.tar.gz Je souhaite séparer Some.file.name et tar.gz Remarque: Le nombre de points dans un nom de fichier n’est pas constant.

J’ai aussi essayé PathFindExtension mais pas de chance. Est-ce possible? Si oui, veuillez m’éclairer. Je vous remercie.

Edit: Je suis vraiment désolé de ne pas avoir spécifié le système d’exploitation. C’est Windows.

Je pense que vous pouvez utiliser std::ssortingng find_last_of pour obtenir l’index du dernier . , et substr pour couper la chaîne (bien que les “extensions complexes” impliquant plusieurs points nécessitent un travail supplémentaire).

Il n’y a aucun moyen de faire ce que vous voulez qui n’implique pas une firebase database d’extensions pour votre but. Il n’y a rien de magique sur les extensions, elles font juste partie d’un nom de fichier (si vous voulez gunzip foo.tar.gz vous obtiendrez probablement un foo.tar, donc pour cette application, .gz est en fait “l’extension”). Donc, pour faire ce que vous voulez, construisez une firebase database d’extensions que vous voulez rechercher et utilisez le “dernier point” si vous n’en trouvez pas.

Il n’ya rien dans la bibliothèque standard C ++ – c’est-à-dire que ce n’est pas dans la norme -, mais chaque système d’exploitation que je connais offre cette fonctionnalité de diverses manières.

Sous Windows, vous pouvez utiliser _splitpath (), et sous Linux, vous pouvez utiliser dirname () & basename ()

Le problème est en effet les noms de fichiers comme *.tar.gz , qui ne peuvent pas être divisés de manière cohérente, du fait que (au moins sous Windows) la partie .tar ne fait pas partie de l’extension. Vous devrez soit garder une liste pour ces cas particuliers et utiliser une ssortingng::rfind pour le rest ou trouver une manière pré-implémentée. Notez que les extensions .tar.* Ne sont pas infinies et très standardisées (il y en a une dizaine, je pense).

Vous pouvez créer une table de consultation des extensions de fichiers que vous pensez pouvoir rencontrer. Et ajoutez également une option de ligne de commande pour en append une nouvelle à la table de recherche si vous rencontrez quelque chose de nouveau. Ensuite, parsingz le nom du fichier pour voir si une entrée de la table de recherche est une sous-chaîne du nom de fichier.

EDIT: Vous pouvez également vous référer à cette question: Chaîne C ++ / STL: Comment imiter la fonction regex comme un joker?