Создать каталог, если он не существует - PullRequest
52 голосов
/ 11 февраля 2012

В моем приложении я хочу скопировать файл на другой жесткий диск, так что это мой код:

 #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;
}

так что после этого он показывает мне на D: HDD файл testEmploi NAm.docx но я хочу, чтобы он создал тестовую папку, если она не существует.

Я хочу сделать это без использования библиотеки Boost.

Ответы [ 8 ]

66 голосов
/ 11 февраля 2012

Используйте функцию WINAPI CreateDirectory() для создания папки.

Вы можете использовать эту функцию, не проверяя, существует ли каталог, поскольку он потерпит неудачу, но GetLastError() вернет ERROR_ALREADY_EXISTS:

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

Код для построения целевого файла неправильный:

string(OutputFolder+CopiedFile).c_str()

это приведет к "D:\testEmploi Nam.docx": отсутствует разделитель пути между каталогом и именем файла,Пример исправления:

string(OutputFolder+"\\"+CopiedFile).c_str()
30 голосов
/ 29 июля 2014

Вероятно, самый простой и эффективный способ - это использовать boost и функции boost :: filesystem. Таким образом, вы можете просто создать каталог и убедиться, что он не зависит от платформы.

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 - документация

20 голосов
/ 30 мая 2016
#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
}
18 голосов
/ 05 марта 2014

Вот простой способ создать папку .......

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

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


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

Этот код хорошо работает для меня.

7 голосов
/ 05 марта 2015

_mkdir также выполнит эту работу.

_mkdir("D:\\test");

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

2 голосов
/ 11 февраля 2012

Использование CreateDirectory (char *DirName, SECURITY_ATTRIBUTES Attribs);

Если функция завершается успешно, в противном случае возвращается ненулевое значение NULL.

1 голос
/ 27 декабря 2018

OpenCV Specific

Opencv поддерживает файловую систему, надеюсь, через свою зависимость Boost.

#include <opencv2/core/utils/filesystem.hpp>
cv::utils::fs::createDirectory(outputDir);
1 голос
/ 06 июля 2017

Вы можете использовать cstdlib

Хотя - http://www.cplusplus.com/articles/j3wTURfi/

#include <cstdlib>

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

Вы также можете проверить, существует ли каталог уже с помощью

#include <dirent.h>
...