Linux C高级编程——目录操作
Linux C目錄操作
?
宗旨:技術(shù)的學(xué)習(xí)是有限的,分享的精神是無限的。
?
?????? Linux思想“一切皆文件”,目錄也是文件,只是存儲的內(nèi)容有別于普通文件。目錄文件中存儲的該目錄下所有的文件及子目錄文件的信息,inode節(jié)點。
一、打開/關(guān)閉目錄文件
1、 opendir
——打開目錄
(1)函數(shù)原型
?
#include <dirent.h> DIR *opendir(const char *dirname);?
(2)函數(shù)參數(shù)
? ? ? ? dirname:要打開的目錄路徑
(3)返回值
? ? ? ? 執(zhí)行成功返回一個目錄流指針(與文件流類似,直接用就行),失敗返回NULL。
?
2、 closedir
——關(guān)閉指定的目錄流
(1)函數(shù)原型
?
#include <dirent.h> int *closedir(DIR *stream);?
(2)函數(shù)參數(shù)
? ? ? ?stream:目錄流指針(類似于文件流指針fp一樣)
(3)返回值
? ? ? ? 執(zhí)行成功返回0,執(zhí)行失敗返回-1。
這兩函數(shù)操作的對象DIR對用戶層是透明,不必關(guān)心其實現(xiàn)細(xì)節(jié)。
【typedef struct dirstream DIR】
?
二、讀/寫目錄內(nèi)容
1、 readdir
——讀取目錄內(nèi)容(目錄下存儲的是該目錄下的文件名和對應(yīng)的磁盤inode信息位置,讀取目錄內(nèi)容就是讀取該目錄下的文件名及文件信息。)
(1) 函數(shù)原型
?
struct dirent *readdir(DIR *stream) struct dirent {long d_ino; // inode值off_t d_off; //從目錄開始到當(dāng)前目錄條的距離unsigned shortd_reclen; // 存儲文件名的空間大小unsigned char d_type; // 文件類型char d_name[256]; // 文件名,’\0’結(jié)束 };?
(2)函數(shù)參數(shù)
? ? ? ? stream:目錄流指針
(3)返回值
? ? ? ? 每調(diào)用一次,返回指向下一個目錄的指針,失敗返回NULL。
?
2、 readdir_r
——讀取目錄內(nèi)容(readdir在多線程中不安全,readdir_r解決了多線程中不安全的問題)
(1)函數(shù)原型
?
int readdir_r(DIR *stream, struct dirent *entry, struct dirent **result);?
(2)函數(shù)參數(shù)
? ? ? ? stream:目錄流指針
? ? ? ? entry:表示第一個參數(shù)所引用的目錄流中的當(dāng)前位置
? ? ? ? result:指示的位置存儲指向該結(jié)構(gòu)的目錄信息
(3)返回值
? ? ? ? 返回成功,在第三個參數(shù)返回一個指向描述目錄條目的struct dirent類型的指針,到達(dá)目錄結(jié)尾,則第三個參數(shù)中返回NULL指針,函數(shù)返回0;執(zhí)行失敗返回-1.
?
三、定位目錄位置
1、 telldir
——目錄流相關(guān)聯(lián)的當(dāng)前位置
(1)函數(shù)原型?
?
long int telldir(DIR *stream);?
(2)函數(shù)參數(shù)
? ? ? ? stream:目錄流指針
(3)返回值
? ? ? ? 成功返回一個long類型的位置值,指示目錄中的當(dāng)前位置,失敗返回-1。
?
2、 seekdir
——在目錄流中設(shè)置下一個readdir操作的位置
(1)函數(shù)原型
?
void seekdir(DIR *stream, long int loc);?
(2)函數(shù)參數(shù)
? ? ? ? stream:目錄流指針
? ? ? ? loc:從telldir()獲取的目錄流中的一個位置
(3)返回值
? ? ? ? 無返回值,錯誤將設(shè)置errno
3、 rewinddir
——將目錄流的位置重置到目錄的開頭
(1)函數(shù)原型
?
void rewinddir(DIR *stream);?
(2)函數(shù)參數(shù)
? ? ? ? stream:目錄流指針
(3)返回值
? ? ? ? 將stream引用的目錄流的位置重置到目錄的開頭。
?
四、添加和刪除目錄
1、 mkdir
——創(chuàng)建一個目錄
(1)函數(shù)原型
?
int mkdir(const char *path, mode_t mode);?
(2)函數(shù)參數(shù)
? ? ? ? path:欲創(chuàng)建的文件的路徑
? ? ? ? mode:目錄的訪問權(quán)限,【mode&~umask&0777】
(3)返回值
? ? ? ? 執(zhí)行成功返回0,失敗返回-1。
?
2、 rmdir
——刪除目錄
(1)函數(shù)原型
?
int rmdir(const char *path);?
(2)函數(shù)參數(shù)
? ? ? ? path:欲刪除的目錄文件路徑
(3)返回值
? ? ? ? ?執(zhí)行成功返回0,失敗返回-1。
?
五、獲取當(dāng)前工作路徑操作
?
char *getcwd(char *buf, size_t size); // 將當(dāng)前路徑的絕對路徑置于buf并返回buf,size的大小必須比返回的路徑名長度大1,否則返回NULLchar *get_current_dir_name(void);// 成功返回絕對路徑,失敗返回NULL<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">??</span>?
?
#include <stdio.h> #include <stdlib.h> #include <dirent.h>int main(int argc, char *argv[]) /* 瀏覽指定文件夾下的文件 */ {DIR *stream;struct dirent *dp;stream = opendir(argv[1]);while((dp = readdir(stream)) != NULL){if(dp->d_name[0] == '.'){continue;}printf("%s ", dp->d_name);}closedir(stream);return 0; }?
總結(jié)
以上是生活随笔為你收集整理的Linux C高级编程——目录操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伤感网络验证系统_知网查重报告单能造假?
- 下一篇: 已知两点坐标求水平距离_已知两点坐标,两