108 votes

Obtenir un nom de fichier à partir d'un chemin

Quelle est la façon la plus simple d'obtenir le nom du fichier à partir d'un chemin ?

string filename = "C:\\MyDirectory\\MyFile.bat"

Dans cet exemple, je devrais obtenir "MonFichier". sans extension.

2 votes

Rechercher à partir de l'arrière jusqu'à ce que vous frappiez un retour arrière ?

2 votes

@KerrekSB, vous voulez dire barre oblique inversée ;)

0 votes

J'ai un std::string qui contient le chemin d'un fichier "c : \\MyDirectory\\Myfile.pdf "Je dois renommer ce fichier en monfichier_md.pdf et je dois donc obtenir le nom du fichier à partir du chemin.

5voto

Adam Erickson Points 44

El boost filesystem est également disponible en tant que experimental/filesystem et a été intégrée à ISO C++ pour C++17. Vous pouvez l'utiliser comme suit :

#include <iostream>
#include <experimental/filesystem>

namespace fs = std::experimental::filesystem;

int main () {
    std::cout << fs::path("/foo/bar.txt").filename() << '\n'
}

Sortie :

"bar.txt"

Il fonctionne également pour std::string objets.

4voto

Fractal Points 571

C'est la seule chose qui a finalement fonctionné pour moi :

#include "Shlwapi.h"

CString some_string = "c:\\path\\hello.txt";
LPCSTR file_path = some_string.GetString();
LPCSTR filepart_c = PathFindFileName(file_path);
LPSTR filepart = LPSTR(filepart_c);
PathRemoveExtension(filepart);

à peu près ce que Skrymsli a suggéré mais ne fonctionne pas avec wchar_t*, VS Enterprise 2015

_splitpath fonctionnait aussi bien, mais je n'aime pas avoir à deviner le nombre de caractères char[ ?] dont j'aurai besoin ; certaines personnes ont probablement besoin de ce contrôle, je suppose.

CString c_model_name = "c:\\path\\hello.txt";
char drive[200];
char dir[200];
char name[200];
char ext[200];
_splitpath(c_model_name, drive, dir, name, ext);

Je ne crois pas qu'aucune inclusion ait été nécessaire pour _splitpath. Aucune bibliothèque externe (comme boost) n'était nécessaire pour l'une ou l'autre de ces solutions.

4voto

X Stylish Points 1331
std::string getfilename(std::string path)
{
    path = path.substr(path.find_last_of("/\\") + 1);
    size_t dot_i = path.find_last_of('.');
    return path.substr(0, dot_i);
}

3voto

TomP89 Points 909

Je le ferais en...

Recherchez en arrière à partir de la fin de la chaîne de caractères jusqu'à ce que vous trouviez la première barre oblique inverse/avant.

Ensuite, recherchez à nouveau en arrière à partir de la fin de la chaîne jusqu'à ce que vous trouviez le premier point (.).

Vous avez alors le début et la fin du nom du fichier.

C'est simple...

3voto

GuidedHacking Points 720

Vous pouvez utiliser le système de fichiers std::filesystem pour le faire très bien :

#include <filesystem>
namespace fs = std::experimental::filesystem;

fs::path myFilePath("C:\\MyDirectory\\MyFile.bat");
fs::path filename = myFilePath.stem();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X