C++ : manipulation de répertoires

De Wiki de Calcul Québec
Aller à : Navigation, rechercher
Autres langues :anglais 100% • ‎français 100%

En C++, l'utilisation de <fstream> pour lire et écrire des fichiers est bien connue et amplement documentée. Cependant, qu'en est-il des répertoires? Comment s'y prend-on pour détecter la présence d'un répertoire ou en créer un nouveau? Les manuels de référence sont peu bavards sur ces questions.

La manipulation des répertoires passe par les fichiers d'entête <dirent.h> et <sys/stat.h>, comme l'illustre cet extrait de code :

Fichier : repertoire.cpp
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
 
//
// Returns whether the specified directory exists.
//
// Example:
// --------
//          if (!directoryExists("output"))
//          {
//              createDirectory("output");
//          }
// --------------------------------------------------------
bool directoryExists(const char* dir)
{
    DIR* dhandle = opendir(dir);
 
    if (dhandle != NULL)
    {
        closedir(dhandle);
        return true;
    }
    else
    {
        return false;
    }
}
 
//
// Creates the specified directory. Fails if the path leading to
// this directory does not exist.
//
// Example:
// --------
//          createDirectory("output");
// --------------------------------------------------------
bool createDirectory(const char* dir)
{
    return mkdir(dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0;
}
 
//
// Creates a complete path.
//
// Example:
// --------
//          createPath("output/sample1/temperature0/");
// --------------------------------------------------------
bool createPath(const char* path)
{
    char localpath[256];
    strcpy(localpath, path);
 
    char directory[256];
    if (path[0] == '/')
    {
        strcpy(directory, "/");
    }
    else
    {
        strcpy(directory, "");
    }
 
    char* pch = strtok(localpath, "/");
    while (pch != NULL)
    {
        strcat(directory, pch);
        strcat(directory, "/");
        if (!directoryExists(directory) && !createDirectory(directory))
        {
            return false;
        }
 
        pch = strtok(NULL, "/");
    }
 
    return true;
}


Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Ressources de Calcul Québec
Outils
Partager