Как создать каталог по заданному пути в C ?

#c #file-handling

Вопрос:

Мне нужно создать функцию, которая создает каталог в подкаталоге текущего местоположения. Вот что я попробовал:

 #include <iostream>
#include <cstring>
#include <dir.h>
#include <stdlib.h>
using namespace std;

void create(){
    char nume[50];
    int directory1,directory2;
    directory1=mkdir("folder1");
    directory2=mkdir("/folder1/ name1");
}

int main()
{
    create();
}
 

Когда я запускаю этот код, каталог «folder1» создается, но «name1» — нет. Что я делаю не так? Я также пытался сделать это:

 #include <iostream>
#include <cstring>
#include <dir.h>
#include <stdlib.h>
using namespace std;

void create(){
    char nume[50];
    system("mkdir folder1");
    system("mkdir /folder1/name1");
}

int main()
{
    create();
}
 

Но я получаю сообщение «Синтаксис команды неверен».

Комментарии:

1. Что я делаю не так? Похоже на дополнительное пространство на пути. Вы хотели, чтобы вторая папка называлась «name1». Также с помощью / вы помещаете его в корень файловой системы вместо относительного пути.

2. mkdir("/folder1/ разве ты не имел в виду mkdir("folder1/ . Я вижу mkdir , что требуется два аргумента: man7.org/linux/man-pages/man2/mkdir. 2.html . Можно ли пройти один из них?

Ответ №1:

Я бы предложил использовать <filesystem> библиотеку, доступную начиная с C 17, в этом случае используя std::filesystem::create_directories

 #include <filesystem>

void create()
{
    std::filesystem::path subfolder = "/folder1/name1";
    std::filesystem::create_directories(subfolder);
}

int main()
{
    create();
}
 

Обратите внимание, что create_directory предполагается, что все родительские каталоги существуют, в противном create_directories случае будут созданы промежуточные каталоги, если они отсутствуют.

Комментарии:

1. Я получаю сообщение об ошибке отладки «abort() была вызвана»

2. @jasd Я подозреваю, что путь должен быть «папка 1/имя 1», а не «/папка 1/имя 1», верно? Прерывание, вероятно, связано с неперехваченным исключением, связанным с разрешениями.

3. @CoryKramer Добро пожаловать, тогда я удалил свой комментарий ^^