2015-09-10 3 views
1

похоже question здесь.Как я могу проверить наличие каталога в программе c и создать его, если его нет

Но он охватывает только один уровень каталога. Например, если вы дали /home/mypc/directory, и если только directory не существует, он создает его. но когда дело доходит до /home/mypc/directory/directory2, где и directory, и directory2 не существует, он дает ошибку ошибки сегментации. Может ли кто-нибудь предложить подходящий метод для этого.

благодарит заранее.

ответ

-1

Если вы собираетесь использовать mkdir создать каталог только добавьте -p.

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

struct stat st = {0}; 

if (stat("/home/mypc/directory/directory2", &st) == -1) { 
    system("mkdir --mode=744 -p /home/mypc/directory/directory2"); 
} 
+0

то что он делает. не могли бы вы объяснить – Laksith

+0

Сначала он проверяет статус каталога. Если он не может получить этот статус, каталог не существует. Поэтому вы вызываете систему для выполнения 'mkdir', который создает полный путь с' -p'. –

+1

ahh это работает .... (Y) спасибо действительно, – Laksith

1

Разделите путь на свои компоненты и проверьте каждый компонент пути. Таким образом, для пути /home/mypc/directory/directory2 вы проверить и, возможно, создать, чтобы

  1. /home
  2. /home/mypc
  3. /home/mypc/directory
  4. /home/mypc/directory/directory2
+0

'#define fileLocation"/home/laksith/Desktop/log/lp "Фактически я собираюсь дать это как макрос. поэтому, когда человек дает какой-либо каталог, редактирующий строку, файлы должны храниться там. – Laksith

6

Если вы не хотите зависеть от внешних процессов, вы могли бы просто написать рекурсивную функцию, чтобы создать иерархию каталогов:

int mkdirhier(char const* target) { 
    int r = 0; 

    struct stat st = {0}; 
    if (-1 != stat(target, &st)) 
     return 0; // already exists 

    char* parent = strdup(target); 
    if (strcmp(dirname(parent), target)) 
     r = mkdirhier(parent); // recurse 

    if (parent) 
     free(parent); 

    if (!r && (r = mkdir(target, 0700))) 
     perror(target); 

    return r; 
} 

Live On Coliru

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <libgen.h> 
#include <errno.h> 
#include <time.h> 

int mkdirhier(char const* target); 

int main() { 
    char buf[1024]; 
    srand(time(NULL)); 

    snprintf(buf, sizeof(buf), "./tree/some%d/dir%d/sub", rand(), rand()); 
    mkdirhier(buf); 

    snprintf(buf, sizeof(buf), "/nopermissions/tree/some%d/dir%d/sub", rand(), rand()); 
    return mkdirhier(buf); 
} 

Отпечатки

gcc main.c; ./a.out; find . 
/nopermissions: Permission denied 
. 
./tree 
./tree/some1804649601 
./tree/some1804649601/dir1553142090 
./tree/some1804649601/dir1553142090/sub 
./main.cpp 
./a.out 
./main.c 
Смежные вопросы