web-dev-qa-db-fra.com

Comment créer des répertoires automatiquement en utilisant ofstream

J'écris maintenant un extracteur pour une archive de base du système de fichiers virtuel (sans compression).

Mon extracteur rencontre des problèmes lorsqu'il écrit un fichier dans un répertoire qui n'existe pas.

Fonction d'extraction:

void extract(ifstream * ifs, unsigned int offset, unsigned int length, std::string path)
{
    char * file = new char[length];

    ifs->seekg(offset);
    ifs->read(file, length);

    ofstream ofs(path.c_str(), ios::out|ios::binary);

    ofs.write(file, length);
    ofs.close();

    cout << patch << ", " << length << endl;

    system("pause");

    delete [] file;
}

ifs est le fichier racine vfs, offset est la valeur au démarrage du fichier, length est la longueur du fichier et path est une valeur du fichier qui sauvegarde compense len etc.

Par exemple, le chemin est data/char/actormotion.txt.

Merci.

25
Kacper Fałat

ofstream ne crée jamais de répertoires. En fait, C++ ne fournit pas un moyen standard de créer un répertoire.

Vous pouvez utiliser dirname et mkdir sur les systèmes Posix, ou les équivalents Windows, ou Boost.Filesystem. Fondamentalement, vous devez ajouter du code juste avant l'appel à ofstream, pour vous assurer que le répertoire existe en le créant si nécessaire.

28
Steve Jessop

Il n'est pas possible avec ofstream de vérifier l'existence d'un répertoire

Peut utiliser boost::filesystem::exists à la place

    boost::filesystem::path dir("path");

    if(!(boost::filesystem::exists(dir))){
        std::cout<<"Doesn't Exists"<<std::endl;

        if (boost::filesystem::create_directory(dir))
            std::cout << "....Successfully Created !" << std::end;
    }
17
P0W

La création d'un répertoire avec ofstream n'est pas possible. Il est principalement utilisé pour les fichiers. Il existe deux solutions ci-dessous:

Solution 1:

#include <windows.h>
int _tmain() {
    //Make the directory
    system("mkdir sample");
}

Solution 2:

#include <windows.h>
int _tmain() {
    CreateDirectory("MyDir", NULL);
}
7