Tạo một thư mục mới trong C


97

Tôi muốn viết một chương trình kiểm tra sự tồn tại của một thư mục; nếu thư mục đó không tồn tại thì nó sẽ tạo thư mục và một tệp nhật ký bên trong nó, nhưng nếu thư mục đã tồn tại, thì nó chỉ tạo một tệp nhật ký mới trong thư mục đó.

Tôi sẽ làm điều này như thế nào trong C với Linux?


1
Hàm mkdir tạo một thư mục mới, blog.tremend.ro/2008/10/06/…
fsonmezay 15/09/11

1
có thể đó là bởi vì bạn có thể tìm thấy giải pháp trong google hoặc thậm chí ở đây bằng cách tạo một tìm kiếm đơn giản stackoverflow.com/search?q=C+make+directory . Nhân tiện, tôi không phải là người đã bỏ phiếu.
fsonmezay

Vui lòng chỉnh sửa câu hỏi của bạn để hiển thị mã bạn có cho đến nay . Bạn nên bao gồm ít nhất một phác thảo (nhưng tốt nhất là một ví dụ có thể tái tạo tối thiểu ) về mã mà bạn đang gặp sự cố, sau đó chúng tôi có thể cố gắng trợ giúp vấn đề cụ thể. Bạn cũng nên đọc Cách hỏi .
Toby Speight

Câu trả lời:


146

Xem statđể kiểm tra xem thư mục có tồn tại không,

mkdir, để tạo một thư mục.

#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);
}

Bạn có thể xem hướng dẫn sử dụng các chức năng này với các lệnh man 2 statman 2 mkdir.


5
Tôi tin rằng mkdirtrong Linux cần một tham số thứ hai mode, ngoài ra path.
Paul R

1
@Uku: việc chuyển một số tham số không chính xác cho một hàm là Hành vi không xác định, vì vậy mặc dù nó có vẻ hoạt động với bạn trong một trường hợp, bạn không nên dựa vào nó.
Paul R

3
Mục đích của việc kiểm tra xem thư mục đó không tồn tại trước khi tạo nó là gì? Ngay cả khi thống kê cho biết nó chưa tồn tại, một quá trình khác có thể đã tạo ra nó trong thời gian chờ đợi.
Brandin

2
@Brandin Tôi đoán tôi đã trả lời một cách mù quáng cho câu hỏi của OP :) Bạn nói đúng về điều kiện chủng tộc.
Arnaud Le Blanc

4
Điều này sẽ được gắn cờ bởi hầu hết các phân tích tĩnh tốt như một nguy cơ TOCTOU
kdopen

22

Bạn có thể sử dụng mkdir:

$ man 2 mkdir

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

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

Điều này sẽ loại bỏ và thay thế các thư mục hiện có?
jjxtra

@jjxtra :: không, nó sẽ không thành công nếu thư mục đã tồn tại, giống như cách bạn đã thực hiện thao tác tương tự từ dòng lệnh.
Paul R

Đó là những gì tôi đã đoán. Bất kỳ vấn đề hiệu suất nào bằng cách bỏ qua kiểm tra thống kê và chỉ mkdir mỗi lần?
jjxtra

@jjxtra: trừ khi bạn đang tạo hàng nghìn thư mục, tôi không thể tưởng tượng sẽ có bất kỳ sự khác biệt nào về hiệu suất có thể đo lường được.
Paul R

7

Tôi muốn viết một chương trình (...) tạo thư mục và một tệp (...) bên trong nó

bởi vì đây là một câu hỏi rất phổ biến, đây là mã để tạo nhiều cấp thư mục và hơn là gọi fopen. Tôi đang sử dụng tiện ích mở rộng gnu để in thông báo lỗi với 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
chỉ 5 xu của tôi - chế độ 0777 cho dir có thể không được mong muốn - có thể 0755 tốt hơn, hoặc thậm chí chuyển qua tham số?
ivan.ukr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.