web-dev-qa-db-fra.com

récupère le répertoire du chemin du fichier c ++

Quel est le moyen le plus simple d’obtenir le répertoire dans lequel se trouve un fichier? J'utilise ceci pour trouver le répertoire de travail.

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

Dans cet exemple, je devrais obtenir "C:\MyDirectory".

17
nidhal

L'initialisation est incorrecte car vous devez échapper aux barres obliques inverses:

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

Pour extraire le répertoire s'il est présent:

string directory;
const size_t last_slash_idx = filename.rfind('\\');
if (std::string::npos != last_slash_idx)
{
    directory = filename.substr(0, last_slash_idx);
}
16
hmjd

Utilisez la fonction Boost.filesystem parent_path ().

Ex. argument c:/toto/bar => c:/toto

Plus d'exemples ici: table de décomposition de chemin et tutoriel ici .

17
Offirmo

Le rapide et sale:

Notez que vous devez recherchez également / car il est autorisé comme séparateur de chemin alternatif sous Windows

#include <string>
#include <iostream>

std::string dirnameOf(const std::string& fname)
{
     size_t pos = fname.find_last_of("\\/");
     return (std::string::npos == pos)
         ? ""
         : fname.substr(0, pos);
}

int main(int argc, const char *argv[])
{
     const std::string fname = "C:\\MyDirectory\\MyFile.bat";

     std::cout << dirnameOf(fname) << std::endl;
}
16
sehe

La manière MFC;

#include <afx.h>

CString GetContainingFolder(CString &file)
{
    CFileFind fileFind;
    fileFind.FindFile(file);
    fileFind.FindNextFile();
    return fileFind.GetRoot();
}

ou, encore plus simple

CString path(L"C:\\my\\path\\document.txt");
path.Truncate(path.ReverseFind('\\'));
12
Steztric

Vous pouvez utiliser la fonction _spliltpath disponible dans l'en-tête stdlib.h. S'il vous plaît se référer à ce lien pour la même chose.

http://msdn.Microsoft.com/en-us/library/e737s6tf%28v=vs.71%29.aspx

5
Ajit Vaze

Une solution multi-plateforme très simple (adaptée de cet exemple pour string::find_last_of):

std::string GetDirectory (const std::string& path)
{
    size_t found = path.find_last_of("/\\");
    return(path.substr(0, found));
}

Cela fonctionne dans les deux cas où les barres obliques peuvent être orientées vers l'arrière ou vers l'avant (ou mixtes), car elles recherchent simplement la dernière occurrence de l'une des chaînes path.

Cependant, ma préférence personnelle consiste à utiliser les bibliothèques Boost :: Filesystem pour gérer de telles opérations. Un exemple:

std::string GetDirectory (const std::string& path)
{
    boost::filesystem::path p(path);
    return(p.parent_path().string());
}

Bien que si obtenir le chemin du répertoire depuis une chaîne soit la seule fonctionnalité dont vous avez besoin, alors Boost risque d’être un peu excessif (d’autant plus que Boost :: Filesystem est l’une des rares bibliothèques Boost qui n’est pas composée uniquement d’en-têtes). Cependant, AFIK, Boost :: Filesystem avait été approuvé pour être inclus dans le standard TR2, mais pourrait ne pas être entièrement disponible avant le standard C++ 14 ou C++ 17 (probablement ce dernier, basé sur this answer ), donc en fonction de votre compilateur (et lorsque vous lisez ceci), vous n’aurez peut-être plus besoin de les compiler séparément car ils pourraient déjà être inclus avec votre système. Par exemple, Visual Studio 2012 peut déjà utiliser certains composants du système de fichiers TR2 (selon cet article ), bien que je ne l'aie pas essayé depuis que j'utilise encore Visual Studio 2010 ... 

3
Jared B.

Comme la question est ancienne, mais je voudrais ajouter une réponse pour que cela soit utile pour les autres.
dans Visual c ++, vous pouvez également utiliser CString ou char array 

CString filename = _T("C:\\MyDirectory\\MyFile.bat");  
PathRemoveFileSpec(filename); 

OUTPUT:

C:\MyDirectory

Incluez Shlwapi.h dans vos fichiers d'en-tête. 

MSDN LINK ici vous pouvez vérifier exemple.

3
Himanshu

C'est la solution appropriée de winapi:

CString csFolder = _T("c:\temp\file.ext");
PathRemoveFileSpec(csFolder.GetBuffer(0));
csFolder.ReleaseBuffer(-1);
2
Andrew Kozlov

C++ 17 fournit std :: filesystem :: path . Il peut être disponible en C++ 11 en; lien avec -lstdc ++ fs. Notez que la fonction ne valide pas le chemin existant. utilisez std :: filesystem :: status pour déterminer le type de fichier (qui peut être filetype :: notfound)

1
gerardw

Le chemin de la coccinelle)

#include<tchar.h>

int GetDir(TCHAR *fullPath, TCHAR *dir) {
    const int buffSize = 1024;

    TCHAR buff[buffSize] = {0};
    int buffCounter = 0;
    int dirSymbolCounter = 0;

    for (int i = 0; i < _tcslen(fullPath); i++) {
        if (fullPath[i] != L'\\') {
            if (buffCounter < buffSize) buff[buffCounter++] = fullPath[i];
            else return -1;
        } else {
            for (int i2 = 0; i2 < buffCounter; i2++) {
                dir[dirSymbolCounter++] = buff[i2];
                buff[i2] = 0;
            }

            dir[dirSymbolCounter++] = fullPath[i];
            buffCounter = 0;
        }
    }

    return dirSymbolCounter;
}

En utilisant :

TCHAR *path = L"C:\\Windows\\System32\\cmd.exe";
TCHAR  dir[1024] = {0};

GetDir(path, dir);
wprintf(L"%s\n%s\n", path, dir);
0
Beetle