版權(quán)聲明:本文為 cdeveloper 原創(chuàng)文章杠河,可以隨意轉(zhuǎn)載茅茂,但必須在明確位置注明出處或渤!
Linux 目錄簡介
在 Linux 下一切皆是文件旺罢。目錄也是文件旷余,在 glibc
中定義了一些對(duì)目錄項(xiàng)的操作,例如使用 opendir
打開目錄扁达,readdir
讀取目錄項(xiàng)等等正卧,這篇文章介紹 Linux 目錄相關(guān)的概念和操作。
目錄項(xiàng)數(shù)據(jù)結(jié)構(gòu)
就像文件有專門的數(shù)據(jù)結(jié)構(gòu)表示一樣跪解,目錄項(xiàng)在內(nèi)核中也有相關(guān)表示炉旷。
目錄項(xiàng):struct dirent
#include <dirent.h>
/* 目錄結(jié)構(gòu)體 */
struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[256];
};
目錄項(xiàng)名稱(文件名)存儲(chǔ)在 d_name
字段中。
目錄流:DIR
就像 FILE
代表文件流一樣,DIR
數(shù)據(jù)結(jié)構(gòu)代表了一個(gè)目錄流,這個(gè)結(jié)構(gòu)定義在 dirent.h
中猿棉。
注意:你不需要主動(dòng)為這些數(shù)據(jù)結(jié)構(gòu)分配內(nèi)存,目錄的操作函數(shù)會(huì)完成內(nèi)存的分配抽高,你只需要在程序中使用指針引用就可以了。
常見目錄 API
下面介紹一些常用的操作目錄的 API透绩。
1. opendir & closedir & readdir
首先來學(xué)習(xí)如何打開和關(guān)閉并讀取一個(gè)目錄:
#include <sys/types.h>
#include <dirent.h>
/*
* name: 目錄名
* return: 成功返回目錄流指針翘骂,失敗返回 NULL,并設(shè)置 errno
*/
DIR *opendir(const char *name);
/*
* dirp:目錄流指針
* return:成功返回 0, 失敗返回 -1, 并設(shè)置 errno
*/
int closedir(DIR *dirp);
/*
* dirp:目錄流指針
* return:成功返回目錄結(jié)構(gòu)指針帚豪,失敗返回空
*/
struct dirent *readdir(DIR *dirp);
看一個(gè)打開和關(guān)閉目錄的例子:
// list_dir.c
#include <sys/types.h>
#include <dirent.h>
int main() {
struct dirent* ep = NULL;
// 打開目錄
DIR *dp = opendir("./");
if (dp != NULL) {
// 讀取目錄項(xiàng)
while (ep = readdir(dp))
puts(ep->d_name);
closedir(dp);
}
return 0;
}
編譯運(yùn)行碳竟,可以看到程序列出了當(dāng)前文件下的文件名。
2. chdir & getcwd
chdir
用來改變調(diào)用進(jìn)程的工作目錄狸臣。
#include <unistd.h>
/*
* path:要改變的工作路徑
* return:成功返回 0, 失敗返回 -1
*/
int chdir(const char *path);
getcwd
用來獲取當(dāng)前進(jìn)程工作路徑:
#include <unistd.h>
/*
* buf:存儲(chǔ)當(dāng)前工作目錄的緩沖區(qū)
* size:緩沖區(qū)的長度
* return:成功返回指向當(dāng)前工作目錄的指針莹桅,失敗返回 NULL,并設(shè)置 errno
*/
char *getcwd(char *buf, size_t size);
來看個(gè)實(shí)際的例子:
// test_chdir.c
#include <stdio.h>
#include <unistd.h>
int main(void) {
char buf[50] = { 0 };
printf("cur dir: %s\n", getcwd(buf, sizeof(buf)));
if (0 == chdir("/home"))
printf("change dir success.\n");
printf("cur dir: %s\n", getcwd(buf, sizeof(buf)));
return 0;
}
編譯運(yùn)行結(jié)果:
cur dir: (null)
change dir success.
cur dir: /home
工作路徑成功修改了烛亦!
3. mkdir
在 shell
中 mkdir
可以創(chuàng)建目錄诈泼,在 C 庫中也有同名的庫函數(shù)可以使用懂拾,來看看使用方法:
#include <sys/stat.h>
#include <sys/types.h>
/*
* pathname: 要?jiǎng)?chuàng)建的目錄路徑
* mode:目錄權(quán)限
* return:成功返回 0, 失敗返回 -1
*/
int mkdir(const char *pathname, mode_t mode);
例如下面的程序創(chuàng)建 hello_test
目錄:
// test_mkdir.c
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(void) {
if (mkdir("./hello_test", 0755) == 0)
printf("create hello_test success.\n");
else
printf("create hello_test fail.\n");
return 0;
}
結(jié)語
本次主要介紹目錄相關(guān)的操作 API,基本使用方法不是很難铐达,詳細(xì)的用法參考 man
手冊(cè)岖赋。
最后,感謝你的閱讀瓮孙,我們下次再見 :)