stat用途是列出檔案的資訊

詳細的資料可以參考這裡

#include <sys/stat.h>
int stat(const char *file_name, struct stat *buf);

第一個參數是傳入的目標檔案名稱,
第二個是一個指標,指向一個struct stat,
struct stat裡面包含了描述這個檔案的所需資料,
在這個作業裡面我們使用到最多次的屬性是"st_mode"
(其實就只是一個描述檔案屬性的一組數字而已)

不過通常我會使用lstat,lstat在讀到symbolic link的時候,
回傳的資料會是symbolic link本身,而不是symbolic link指向的檔案

使用範例:

if(lstat(ct,&st)<0) perror("lstat"); else { if(S_ISDIR(st.st_mode)) printf("/"); else if(st.st_mode&S_IXUSR || st.st_mode&S_IXGRP || st.st_mode&S_IXOTH) printf("*"); }

這段程式碼就是先用lstat取得屬性之後,
再利用內建的巨集"S_ISDIR"判斷這個檔案是否為資料夾
如果是的話,印出/ 
否則檢查檔案是否擁有執行的權限,有的話印出*

剛剛說過,st_mode其實就是一組數字,
而S_IXUSR這些則是系統事先定義好的常數,
方便我們直接使用&運算來判斷檔案是不是擁有某種屬性

這作業還有一個比較麻煩的地方就是讀取資料一個資料夾下擁有的檔案,
讀取方法是

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dir);

DIR *dp ; struct dirent *dirp; if((dp=opendir("filepath"))==NULL) { perror("opendir"); } else { while(dirp=deaddir(dirp)) { printf("%s\n",dent->d_name); } }

 

利用DIR *dp 來接收opendir的結果
接收完後利用readdir函數,把資料寫入struct dirent *dirp這個參數
然後印出~

 

 

smartPG 發表在 痞客邦 PIXNET 留言(0) 人氣()