在 C 語言中建立一個新目錄
本文將演示關於如何在 C 語言中建立新目錄的多種方法。
使用 mkdir
函式建立新目錄
mkdir
是一個符合 POSIX 標準的函式,可以用來建立一個新的目錄。該函式需要兩個引數-第一個引數是指向新建立的目錄路徑名的 char
指標,第二個引數指定許可權位,許可權位用位掩碼錶示,可以使用預定義的巨集常量進行設定。
在下面的例子中,我們宣告一個常量字串變數作為目錄名傳遞,並指定 S_IRWXU
模式位,這意味著所有者將擁有目錄的讀/寫/執行許可權。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *name = "Arbitrary Directory";
int main(void) {
mkdir(name, S_IRWXU);
exit(EXIT_SUCCESS);
}
儘管我們在前面的例子中把 mkdir
呼叫放在單行程式碼中,但在處理生產級程式碼時,實現錯誤檢查例程是很重要的。一開始,我們應該檢查是否建立了一個新的目錄,如果後面的程式碼部分依賴於給定的目錄,則可以成功執行。需要注意的是,當錯誤發生時,mkdir
會返回 -1
,並相應設定 errno
。在這種情況下,我們實現了一個 switch
語句來檢查一些錯誤程式碼,並將相應的資訊列印到控制檯。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <errno.h>
const char *name = "Arbitrary Directory";
int main(void) {
errno = 0;
int ret = mkdir(name, S_IRWXU);
if (ret == -1) {
switch (errno) {
case EACCES :
printf("the parent directory does not allow write");
exit(EXIT_FAILURE);
case EEXIST:
printf("pathname already exists");
exit(EXIT_FAILURE);
case ENAMETOOLONG:
printf("pathname is too long");
exit(EXIT_FAILURE);
default:
perror("mkdir");
exit(EXIT_FAILURE);
}
}
exit(EXIT_SUCCESS);
}
使用 mkdirat
函式建立新目錄
mkdirat
是另一個操作類似的系統呼叫,但它需要三個引數。第一個引數是目錄檔案描述符,可以用 dirfd
系統呼叫檢索。需要注意的是,當作為第二個引數指定的路徑名是相對的時,就會使用這個檔案描述符。在這種情況下,路徑被解釋為相對於給定目錄,而不是相對於當前工作目錄。
mkdirat
具有與 mkdir
相同的返回型別值,errno
的值也可以進行相應的檢查(參見本頁面上的完整列表)。下面的示例程式碼試圖在前一個目錄中建立一個新的目錄到當前的目錄中。
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <errno.h>
const char *name = "Arbitrary Directory";
int main(void) {
DIR *dir = opendir("../");
int dfd = dirfd(dir);
errno = 0;
int ret = mkdirat(dfd, name, S_IRWXU);
if (ret == -1) {
switch (errno) {
case EACCES :
printf("the parent directory does not allow write");
exit(EXIT_FAILURE);
case EEXIST:
printf("pathname already exists");
exit(EXIT_FAILURE);
case ENAMETOOLONG:
printf("pathname is too long");
exit(EXIT_FAILURE);
default:
perror("mkdir");
exit(EXIT_FAILURE);
}
}
closedir(dir);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn