衡陽縣做淘寶網(wǎng)站建設(shè)內(nèi)存優(yōu)化大師
目錄
1. 前言
2. 函數(shù)介紹
2.1?訪問目錄 – opendir
2.2?訪問目錄 – readdir?
2.3?訪問目錄 – closedir?
2.4?修改文件訪問權(quán)限 – chmod/fchmod
2.5?獲取文件屬性 – stat/lstat/fstat
2.5.1?文件屬性 – struct? stat
2.6?文件類型 – st_mode
3. 代碼練習(xí)?
3.1 要求
3.2 代碼實(shí)現(xiàn)
3.2.1 依賴庫文件
3.2.2 聲明子函數(shù)
3.2.3 實(shí)現(xiàn)子函數(shù)
3.2.4 main函數(shù)實(shí)現(xiàn)?
5. 總結(jié)
1. 前言
本文通過介紹文件目錄以及文件屬性相關(guān)函數(shù)進(jìn)行目錄操作和文件屬性獲取。
2. 函數(shù)介紹
2.1?訪問目錄 – opendir
opendir函數(shù)用來打開一個目錄文件:
?#include? <dirent.h>DIR? *opendir(const char *name);DIR *fdopendir(int fd);? 使用文件描述符,要配合open函數(shù)使用
- DIR是用來描述一個打開的目錄文件的結(jié)構(gòu)體類型
- 成功時返回目錄流指針;出錯時返回NULL
2.2?訪問目錄 – readdir?
readdir函數(shù)用來讀取目錄流中的內(nèi)容:
?#include? <dirent.h>struct? dirent *readdir(DIR *dirp);
- struct dirent是用來描述目錄流中一個目錄項(xiàng)的結(jié)構(gòu)體類型
- 包含成員char? d_name[256]?? 參考幫助文檔
- 成功時返回目錄流dirp中下一個目錄項(xiàng);
- 出錯或到末尾時時返回NULL
2.3?訪問目錄 – closedir?
closedir函數(shù)用來關(guān)閉一個目錄文件:
?#include? <dirent.h>int closedir(DIR *dirp);
- ?成功時返回0;出錯時返回EOF
2.4?修改文件訪問權(quán)限 – chmod/fchmod
chmod/fchmod函數(shù)用來修改文件的訪問權(quán)限:
?#include? <sys/stat.h>int? chmod(const char *path, mode_t mode);int? fchmod(int fd, mode_t mode);
- 成功時返回0;出錯時返回EOF
- root和文件所有者能修改文件的訪問權(quán)限
- 示例: chmod(“test.txt”, 0666);
2.5?獲取文件屬性 – stat/lstat/fstat
stat/lstat/fstat函數(shù)用來獲取文件屬性:
?#include? <sys/stat.h>int? stat(const char *path, struct stat *buf);int? lstat(const char *path, struct stat *buf);int? fstat(int fd, struct stat *buf);
- 成功時返回0;出錯時返回EOF
- 如果path是符號鏈接stat獲取的是目標(biāo)文件的屬性;而lstat獲取的是鏈接文件的屬性?
2.5.1?文件屬性 – struct? stat
struct stat是存放文件屬性的結(jié)構(gòu)體類型:
struct stat {dev_t st_dev; //文件的設(shè)備編號ino_t st_ino; //節(jié)點(diǎn)mode_t st_mode; //文件的類型和存取的權(quán)限nlink_t st_nlink; //連到該文件的硬連接數(shù)目,剛建立的文件值為1uid_t st_uid; //用戶IDgid_t st_gid; //組IDdev_t st_rdev; //(設(shè)備類型)若此文件為設(shè)備文件,則為其設(shè)備編號off_t st_size; //文件字節(jié)數(shù)(文件大小)unsigned long st_blksize; //塊大小(文件系統(tǒng)的I/O 緩沖區(qū)大小)unsigned long st_blocks; //塊數(shù)time_t st_atime; //最后一次訪問時間time_t st_mtime; //最后一次修改時間time_t st_ctime; //最后一次改變時間(指屬性)
};
2.6?文件類型 – st_mode
通過系統(tǒng)提供的宏來判斷文件類型:
S_ISREG(st_mode) | 是否常規(guī)文件 |
S_ISDIR(st_mode) | 是否目錄 |
S_ISCHR(st_mode) | 是否字符設(shè)備 |
S_ISBLK(st_mode) | 是否塊設(shè)備 |
S_ISFIFO(st_mode) | 是否FIFO文件 |
S_ISLNK(st_mode) | 是否鏈接文件 |
S_ISSOCK(st_mode) | 是否SOCKET文件 |
通過系統(tǒng)提供的宏來獲取文件訪問權(quán)限:??????????????
S_IRUSR | 所有者有讀權(quán)限 |
S_IWUSR | 所有者擁有寫權(quán)限 |
S_IXUSR | 所有者擁有執(zhí)行權(quán)限 |
S_IRGRP | 群組擁有讀權(quán)限 |
S_IWGRP | 群組擁有寫權(quán)限 |
S_IXGRP? | 群組擁有執(zhí)行權(quán)限 |
S_IROTH | 其他用戶擁有讀權(quán)限 |
S_IWOTH | 其他用戶擁有寫權(quán)限 |
S_IXOTH | 其他用戶擁有執(zhí)行權(quán)限 |
3. 代碼練習(xí)?
3.1 要求
遍歷一個文件夾下所有文件,并打印文件大小和日期?
3.2 代碼實(shí)現(xiàn)
3.2.1 依賴庫文件
#include <dirent.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
3.2.2 聲明子函數(shù)
void ReadDir(DIR* dp);
3.2.3 實(shí)現(xiàn)子函數(shù)
若讀到的目錄項(xiàng)為"."或".."則跳過;
判定是否為常規(guī)文件,若是,則打印文件大小和日期。
注意:這里的stat若打開除程序允許目錄的其他文件夾中的文件,其中path變量不能只是當(dāng)前目錄下的文件名,那樣會出現(xiàn)未找到文件或者目錄的錯誤,應(yīng)該是文件的絕對路徑。
void ReadDir(DIR* dp)
{struct dirent *dt;int ret;while((dt = readdir(dp))!=NULL){struct stat buf;if((strcmp(dt->d_name,"..")!=0)&&(strcmp(dt->d_name,".")!=0)){printf("%s",dt->d_name);}ret = stat(dt->d_name,&buf);if(ret<0){perror("stat");return;}if(S_ISREG(buf.st_mode)){printf(" %d",(int)buf.st_size);struct tm* t;t = localtime(&buf.st_ctime);printf(" %d-%d-%d %d:%d\n",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);}else{printf("\n");}}return;
}
3.2.4 main函數(shù)實(shí)現(xiàn)?
int main(int argc,char* argv[])
{DIR* dp;struct dirent *dt;dp = opendir("/home/linux/Lv5/Day9/");if(dp == NULL){perror("opendir");return 0;}ReadDir(dp);closedir(dp);return 0;
}
4. 測試
5. 總結(jié)
本文介紹了文件目錄以及文件屬性相關(guān)函數(shù),并通過代碼練習(xí)實(shí)現(xiàn)了目錄和文件屬性獲取。
????? ????