Створення нового каталогу в C


96

Я хочу написати програму, яка перевіряє наявність каталогу; якщо цей каталог не існує, тоді він створює каталог і файл журналу всередині нього, але якщо каталог вже існує, тоді він просто створює новий файл журналу в цій папці.

Як я можу це зробити в C на Linux?


1
Функція mkdir створює новий каталог, blog.tremend.ro/2008/10/06/…
fsonmezay

1
можливо, це тому, що ви можете знайти рішення в google або навіть тут, зробивши простий пошук stackoverflow.com/search?q=C+make+directory . До речі, я не той хлопець, який проголосував.
fsonmezay

Будь ласка, відредагуйте своє запитання, щоб показати код, який у вас є на сьогодні . Ви повинні включити принаймні контур (але бажано мінімальний відтворюваний приклад ) коду, з яким у вас є проблеми, тоді ми можемо спробувати допомогти у вирішенні конкретної проблеми. Ви також повинні прочитати Як запитувати .
Тобі Спейт,

Відповіді:


146

Перевірте, statчи існує каталог,

І mkdir, щоб створити каталог.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat st = {0};

if (stat("/some/directory", &st) == -1) {
    mkdir("/some/directory", 0700);
}

Ви можете побачити інструкцію з цих функцій за допомогою команд man 2 statі man 2 mkdir.


5
Я вважаю, що mkdirпід Linux потрібен ще один параметр, modeкрім path.
Paul R,

1
@Uku: передача некоректної кількості параметрів функції є невизначеною поведінкою, тому, хоча в одному випадку це може працювати для вас, ви не повинні на це покладатися.
Paul R

3
Яка мета перевірки, що каталог не існує перед його створенням? Навіть якщо стати говорить, що його ще не існує, тим часом його міг створити інший процес.
Брандін

2
@Brandin Думаю, я сліпо відповів на питання ОП :) Ви маєте рацію щодо стану перегонів.
Арно Ле Блан

4
Це буде позначено більшістю хороших статичних аналізаторів як ризик
TOCTOU

22

Ви можете використовувати mkdir:

$ людина 2 мкдир

#include <sys/stat.h>
#include <sys/types.h>

int result = mkdir("/home/me/test.txt", 0777);

Це видалить та замінить існуючі каталоги?
jjxtra

@jjxtra :: ні, це повинно вийти з ладу, якщо каталог уже існує, приблизно так само, як якщо б ви спробували ту саму операцію з командного рядка.
Paul R

Ось про що я б здогадався. Будь-яка проблема з продуктивністю, пропускаючи перевірку статистики та просто mkdir кожного разу?
jjxtra

@jjxtra: якщо ви не створюєте тисячі каталогів, я не уявляю, що може бути якась помітна різниця в продуктивності.
Paul R

7

Я хочу написати програму, яка (...) створює каталог і (...) файл всередині нього

оскільки це дуже поширене запитання, ось код для створення декількох рівнів каталогів, а потім виклик fopen. Я використовую розширення gnu для друку повідомлення про помилку за допомогою printf.

void rek_mkdir(char *path) {
    char *sep = strrchr(path, '/');
    if(sep != NULL) {
        *sep = 0;
        rek_mkdir(path);
        *sep = '/';
    }
    if(mkdir(path, 0777) && errno != EEXIST)
        printf("error while trying to create '%s'\n%m\n", path); 
}

FILE *fopen_mkdir(char *path, char *mode) {
    char *sep = strrchr(path, '/');
    if(sep) { 
        char *path0 = strdup(path);
        path0[ sep - path ] = 0;
        rek_mkdir(path0);
        free(path0);
    }
    return fopen(path,mode);
}

3
лише мої 5 центів - режим 0777 для реж може бути не бажаним - можливо, 0755 краще, або навіть передавати параметр?
ivan.ukr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.