首先介紹 stat 結構體,其結構體中包含以下型別:
這些資料型別配合以下的巨集定義用於使使用者檢視檔案的各項資訊
檔案型別巨集:
使用案例部分**如下(判斷是否為目錄檔案):
int
main
(int argc,
char
*ar**)...
函式原型:
#include
mode_t umask
(mode_t cmask)
;
此函式用於建立檔案時給檔案設定許可權的遮蔽標誌,對應八進位制數中的每一位代表一位遮蔽。具體遮蔽位參考《unix高階環境程式設計》圖4-10。
#include
intchown
(const
char
*pathname, uid_t owner, gid_t group)
;//使用者許可權賦予函式
inttrucate
(const
char
*pathname, off_t length)
;//檔案截斷函式
intlink
(const
char
*existingpath,
const
char
*newpath)
;//建立新鏈結
intunlink
(const
char
*pathname)
;//刪除目錄
intsymlink
(const
char
*actualpath,
const
char
*sympath)
;//建立符號鏈結
ssize_t readlink
(const
char
*restrict pathname,
char
*restrict buf, size_t bufsize)
;//解決open函式不能讀取symlink的問題
intfutimens
(int fd,
const
struct timespec time[2]
);//更改訪問時間和修改時間
intredir
(const
char
*pathname)
;//刪除空目錄
程式**於《unix高階環境程式設計》
#include
"apue.h"
#include
#include
/* function type that is called for each filename */
typedef
intmyfunc
(const
char*,
const
struct stat *
,int);
//定義函式型別myfunc
static myfunc myfunc;
static
intmyftw
(char
*, myfunc *);
static
intdopath
(myfunc *);
static
long nreg, ndir, nblk, nchr, nfifo, nslink, nsock, ntot;
intmain
(int argc,
char
*ar**)
/* * descend through the hierarchy, starting at "pathname".
* the caller's func() is called for every file.
*/#define ftw_f 1
/* file other than directory */
#define ftw_d 2
/* directory */
#define ftw_dnr 3
/* directory that can't be read */
#define ftw_ns 4
/* file that we can't stat */
static
char
*fullpath;
/* contains full pathname for every file */
static size_t pathlen;
static
int/* we return whatever func() returns */
myftw
(char
*pathname, myfunc *func)
) */
if(pathlen <=
strlen
(pathname)
)strcpy
(fullpath, pathname)
;return
(dopath
(func));
}/** descend through the hierarchy, starting at "fullpath".
* if "fullpath" is anything other than a directory, we lstat() it,
* call func(), and return. for a directory, we call ourself
* recursively for each name in the directory.
*/static
int/* we return whatever func() returns */
dopath
(myfunc* func)
fullpath[n++]=
'/';
//加上『/』號
fullpath[n]=0
;//刪除後面目錄if(
(dp =
opendir
(fullpath))==
null
)/* can't read directory */
return
(func
(fullpath,
&statbuf, ftw_dnr));
while
((dirp =
readdir
(dp))!=
null
) fullpath[n-1]
=0;/* erase everything from slash onward */if(
closedir
(dp)
<0)
err_ret
("can't close directory %s"
, fullpath)
;return
(ret);}
static
intmyfunc
(const
char
*pathname,
const
struct stat *statptr,
int type)
break
;case ftw_d:
ndir++
;break
;case ftw_dnr:
err_ret
("can't read directory %s"
, pathname)
;break
;case ftw_ns:
err_ret
("stat error for %s"
, pathname)
;break
;default
:err_dump
("unknown type %d for pathname %s"
, type, pathname);}
return(0);}
首先在main函式中讀入開始目錄,並將其傳遞給pathname引數,同時將myfunc函式作為引數傳遞給myftw函式
在myftw函式中給fullpath分配空間並接收pathname引數的值,再呼叫dopath函式正式開始計數
在dopath函式中遞迴呼叫自身並遍歷目錄中的每個檔案,同時呼叫myfunc函式判斷檔案種類並計算
最後在主函式中列印各類檔案數目和佔比
Unix環境高階程式設計學習筆記 二
三種主要的標準 iso c ieee posix single unix specification xsi 一層一層遞增,ieee posix 是iso c的超集。xsi 是posix的超集。要想提高軟體的可移植性,就必須有限制 編譯時限制 因為某些限制是固定的,則可以在標頭檔案中定義。執行時限制...
UNIX環境高階程式設計學習筆記
include include include include int main int argc,char argv err sys can t open s argv 1 while dirp readdir dp null printf s n dirp d name closedir dp ...
UNIX環境高階程式設計學習筆記 程序
2.程序控制 在提出這個問題的時候,我想了一下,大概就是核心執行的乙個程式 錯誤回答 吧。但是這麼說,連我自己下次看都不明白在說什麼。於是我查了一下,它代表著cpu所能處理的單個任務,及執行例項。在面向程序設計的系統 如早期 unix,linux 2.4及更早版本中 程序是程式的基本執行實體 在面向...