2012-02-10 3 views
37

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

#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.

ответ

51

Используйте функцию 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() 
+0

спасибо за быстрый ответ так, как я могу смешать его с членом CopyFile – pourjour

+0

До вызова 'CopyFile()' 'называют CreateDirectory()' для создания 'OutputFolder'. – hmjd

+0

спасибо, что это прекрасно работает – pourjour

16

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

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

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


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

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

+10

Спасибо за включение файла .h file, который для нас новичков трудно определить. – John

22

Возможно, самый простой и эффективный способ - использовать функции 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

+2

Какие заголовки вам нужно использовать здесь? – vegetus

+0

Для таких гуглеров, как я, '#include ' Также передайте '-lboost_filesystem -lboost_system' в компоновщик – hewy

8
#include <experimental/filesystem> // or #include <filesystem> 

namespace fs = std::experimental::filesystem; 

if (!fs::exists("src")) { // Check if src folder exists 
    fs::create_directory("src"); // create src folder 
} 
+1

Просто нужно скомпилировать с -lstdC++ fs –

+1

Логика ошибочна, если «src» указывает на файл вместо каталога, вы должны добавить вызов is_directory (или что-то еще, что он называется) – stijn

+0

@stijn Исправлено! ;) – Vertexwahn

1

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

Although- http://www.cplusplus.com/articles/j3wTURfi/

#include <cstdlib> 

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

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

#include <dirent.h> 
+0

это не переносимо, поскольку опция '-p' не работает с версией windows mkdir. –

Смежные вопросы