web-dev-qa-db-fra.com

Créer un répertoire s'il n'existe pas

Dans mon application, je veux copier un fichier sur l'autre disque dur, voici donc mon code:

 #include <windows.h>

using namespace std;

int main(int argc, char* argv[] )
{
    string Input = "C:\\Emploi NAm.docx";
    string CopiedFile = "Emploi NAm.docx";
    string OutputFolder = "D:\\test";
    CopyFile(Input.c_str(), string(OutputFolder+CopiedFile).c_str(), TRUE);

    return 0;
}

donc après avoir exécuté ceci, il me montre dans le D:HDD un fichier testEmploi NAm.docx mais je veux qu’il crée le dossier de test s’il n’existe pas.

Je veux le faire sans utiliser la bibliothèque Boost.

53
pourjour

Utilisez la fonction WINAPI CreateDirectory() pour créer un dossier.

Vous pouvez utiliser cette fonction sans vérifier si le répertoire existe déjà car il échouera mais GetLastError() renverra ERROR_ALREADY_EXISTS:

if (CreateDirectory(OutputFolder.c_str(), NULL) ||
    ERROR_ALREADY_EXISTS == GetLastError())
{
    // CopyFile(...)
}
else
{
     // Failed to create directory.
}

Le code de construction du fichier cible est incorrect:

string(OutputFolder+CopiedFile).c_str()

cela produirait "D:\testEmploi Nam.docx": il manque un séparateur de chemin entre le répertoire et le nom du fichier. Exemple de correction:

string(OutputFolder+"\\"+CopiedFile).c_str()
66
hmjd

Le moyen le plus simple et le plus efficace consiste probablement à utiliser les fonctions boost et boost :: filesystem. De cette façon, vous pouvez simplement créer un répertoire et vous assurer qu'il est indépendant de la plate-forme.

const char* path = _filePath.c_str();
boost::filesystem::path dir(path);
if(boost::filesystem::create_directory(dir))
{
    std::cerr<< "Directory Created: "<<_filePath<<std::endl;
}

boost :: filesystem :: create_directory - documentation

32
Chris Rayner
#include <experimental/filesystem> // or #include <filesystem>

namespace fs = std::experimental::filesystem;


if (!fs::is_directory("src") || !fs::exists("src")) { // Check if src folder exists
    fs::create_directory("src"); // create src folder
}
20
Vertexwahn

Voici le moyen simple de créer un dossier .......

#include <windows.h>
#include <stdio.h>

void CreateFolder(const char * path)
{   
    if(!CreateDirectory(path ,NULL))
    {
        return;
    }
}


CreateFolder("C:\\folder_name\\")

Ce code ci-dessus fonctionne bien pour moi.

18
Fivee Arch

_mkdir fera également le travail.

_mkdir("D:\\test");

https://msdn.Microsoft.com/en-us/library/2fkk4dzw.aspx

7
Eliko

Utilisez CreateDirectory (char *DirName, SECURITY_ATTRIBUTES Attribs);

Si la fonction réussit, elle renvoie non nul, sinon NULL.

2
DotNetUser

spécifique à OpenCV

Opencv supporte le système de fichiers, probablement à travers sa dépendance Boost.

#include <opencv2/core/utils/filesystem.hpp>
cv::utils::fs::createDirectory(outputDir);
2
saurabheights

Vous pouvez utiliser cstdlib

Bien que http://www.cplusplus.com/articles/j3wTURfi/

#include <cstdlib>

const int dir= system("mkdir -p foo");
if (dir< 0)
{
     return;
}

vous pouvez également vérifier si le répertoire existe déjà en utilisant

#include <dirent.h>
1
Noa Yehezkel