web-dev-qa-db-ja.com

ディレクトリが存在しない場合は作成します

私のアプリでは、ファイルを他のハードディスクにコピーしたいので、これが私のコードです:

 #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ライブラリを使用せずにそれを行いたい。

53
pourjour

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()
66
hmjd

おそらく最も簡単で効率的な方法は、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-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

以下にフォルダを作成する簡単な方法を示します。

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

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


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

上記のコードは私にとってはうまく機能します。

18
Fivee Arch

_mkdirも仕事をします。

_mkdir("D:\\test");

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

7
Eliko

CreateDirectory (char *DirName, SECURITY_ATTRIBUTES Attribs); を使用します

関数が成功した場合、ゼロ以外を返します。それ以外の場合は、NULL

2
DotNetUser

OpenCV固有

Opencvは、おそらくその依存関係Boostによってファイルシステムをサポートします。

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

使用できますcstdlib

けれども http://www.cplusplus.com/articles/j3wTURfi/

#include <cstdlib>

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

を使用して、ディレクトリが既に存在するかどうかを確認することもできます

#include <dirent.h>
1
Noa Yehezkel