天天看點

23-與目錄有關的函數-mkdir 與 rmdir

mkdir 是用來建立一個空目錄的,而 rmdir 用來删除空目錄。與 linux 指令的 ​

​mkdir​

​不同的是,mkdir 函數需要指定目錄的權限位。想必你已經對 mode 相當熟悉了。不過,對于目錄來說,權限位還有一些坑,也沒那麼容易。

1 目錄的權限位

  • 目錄的權限位,至少要設定一個執行許可位。即​

    ​rwx​

    ​​ 中的那個​

    ​x​

    ​​ 位。如果不設定,就沒辦法使用​

    ​cd​

    ​ 指令進入目錄,也無法讀取目錄下的檔案内容。是以,這個位是必須的。
  • 目錄的寫權限位。如果未設定寫權限位(​

    ​w​

    ​ 位),将導緻無法向目錄檔案中寫入目錄項(dir_entry 結構)。比如不能使用 touch 指令建立檔案。
  • 目錄的讀權限位。如果未設定讀權限位,将導緻無法讀取目錄檔案中的目錄項。比如你不能使用 ls 指令檢視目錄項的具體内容。

推薦使用的目錄權限位是 ​

​rwxrwxr-x​

​,即 8 進制的 775.

2 執行個體

2.1 實作 mymkdir 指令

  • 函數原型
int mkdir(const char      
  • 代碼
// mymkdir.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
  if (mkdir(argv[1], 0775) == -1) { // 權限位設定為 0775 注意前面的 0 不能少,它表示 8 進制的數。
    perror("mkdir");
    return -1; 
  }
  return 0;
}      
  • 編譯
$ gcc mymkdir.c -o mymkdir      
  • 運作
$ ./mymkdir testdir
$ ll      
drwxrwxr-x  3 allen allen 4096 12月  4 18:06 ./
drwxrwxr-x 10 allen allen 4096 12月  3 12:46 ../
-rwxrwxr-x  1 allen allen 7460 12月  3 12:42 mychdir*
-rw-rw-r--  1 allen allen  199 12月  3 12:42 mychdir.c
-rwxrwxr-x  1 allen allen 7384 12月  4 18:02 mymkdir*
-rw-rw-r--  1 allen allen  203 12月  4 18:02 mymkdir.c
-rwxrwxr-x  1 allen allen 7384 12月  3 22:34 myrmdir*
-rw-rw-r--  1 allen allen  152 12月  3 22:34 myrmdir.c
drwxrwxr-x  2 allen allen 4096 12月  4 18:02 testdir/      

2.2 實作 rmdir 指令

  • 函數原型
int rmdir(const char      
  • 代碼
// myrmdir.c
#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
  if (rmdir(argv[1]) == -1) {
    perror("rmdir");
    return -1; 
  }
  return 0;
}      
  • 編譯
$ gcc myrmdir.c -o myrmdir      
  • 運作
$ ./myrmdir testdir      

3 總結

  • 知道不合适的目錄權限位會帶來什麼後果
  • 掌握 mkdir 函數和 rmdir 函數
  • 知道 mkdir 不能建立多級目錄
  • 知道 rmdir 隻能删除空目錄

繼續閱讀