Linux環境程式設計之檔案目錄

2021-12-29 23:05:44 字數 4119 閱讀 4548

1.stat函式

stat函式返回乙個與此命名檔案有關的資訊結構,fstat函式獲得已在描述符filedes上開啟的檔案的有關資訊。lstat函式類似於stat,但是當命名的檔案是乙個符號連線時,lstat返回該符號連線的有關資訊,而不是由該符號連線引用的檔案的資訊。

view plaincopy to clipboardprint?

#include   

#include   

int stat(const char *pathname, struct stat *buf) ; 

int fstat(int filedes,struct stat *buf) ; 

int lstat(const char *pathname, struct stat *buf) ; 

三個函式的返回:若成功則為0,若出錯則為-1

stat的資料結構如下所示

view plaincopy to clipboardprint?

struct stat { 

mode_t st_mode; /* 檔案型別和許可權*/ 

ino_t st_ino; /* inode 號*/  

nlink_t st_nlink; /* 鏈結數目*/  

uid_t st_uid; /* 檔案所有者的uid*/  

gid_t st_gid; /* 檔案所有者的組id */  

off_t st_size; /* 檔案大小*/  

time_t st_atime; /* 最後訪問時間*/ 

time_t st_mtime; /* 最後修改時間*/ 

time_t st_ctime; /* 最後檔案狀態修改時間*/  

blksize_t st_blksize; /* 最佳讀寫i/o塊大小*/  

blkcnt_t st_blocks; /* 一共有多少個塊*/  

2.access函式

access按實際使用者id和實際組id進行檔案許可權的測試。

view plaincopy to clipboardprint?

#include   

int access(const char *pathname, int mode) ; 

返回:若成功則為0,若出錯則為-1

引數解析:

mode值可以是以下幾種:

r_ok   測試讀許可權

w_ok  測試寫許可權

x_ok   測試執行許可權

f_ok    測試檔案是否存在

3.truncate函式

truncate 把某個檔案截短到一定長度,跟open中的o_trunc類似。

view plaincopy to clipboardprint?

int truncate(const char *pathname, off_t length); 

int ftruncate(int filedes, off_t length);  

成功返回0 ,失敗返回-1

4.與鏈結有關的函式

link函式用來建立乙個硬鏈結檔案

int link(const char *existingpath, const char   *newpath);

symlink用來建立乙個軟鏈結檔案

int symlink(const char *actualpath, const char   *sympath);

unlink刪除軟鏈結時只刪除鏈結檔案本身,被連線的檔案不受影響。刪除硬鏈結時,如果inode引用數為0,則刪除檔案。如果有程序還在使用該檔案,則可以繼續使用。

int unlink(const char *pathname);

readlink只讀取軟連線本身

ssize_t readlink(const char* restrict pathname,   char *restrict buf, size_t bufsize);

5.utime函式

utime讀取檔案的最後訪問時間和修改實際那

view plaincopy to clipboardprint?

#include   

int utime(const char *pathname, const struct  utimbuf *times); 

struct utimbuf { 

time_t actime; /* 最後訪問時間*/ 

time_t modtime; /* 最後修改時間*/ 

inode屬性的修改時間有核心來完成,應用程式沒有許可權去設定。

6.目錄操作函式

opendir用來開啟乙個目錄 的內容,並返回目錄指證。

#include

dir *opendir(const char *pathname); 成功返回dir指標,失敗返回null

readdir 以一定次序讀取目錄內容,

struct dirent *readdir(dir *dp);

struct dirent {

ino_t d_ino; /* i-node 號*/

char  d_name[name_max + 1]; /*檔案或目錄名*/

rewinddir 重置目錄的輸入流,重置後從第乙個目錄項開始讀。

void rewinddir(dir *dp);

telldir 返回目錄流的當前位置

long telldir(dir *dp);

seekdir  設定目錄流位置。

void seekdir(dir *dp, long loc);

loc有telldir返回

closedir  關閉目錄流

int closedir(dir *dp);

下面的例子是遞迴遍歷乙個目錄,列印出這個目錄下所有的檔案和目錄,並且需要列印出這些檔案的型別(比如 鏈結檔案,普通檔案等)。

view plaincopy to clipboardprint?

#include   

#include   

#include   

#include   

#include   

#include   

#include   

#include   

void iterate_dir( char *dir ); 

int main(int argc, char **ar**) 

if( argc != 2 ){ 

printf("usage: command dir/n"); 

return -1; 

iterate_dir( ar**[1] ); 

return 0; 

void iterate_dir ( char * dir ) 

dir *cur_dir; 

struct dirent *dir_ent; 

struct stat    dir_stat; 

char path[path_max]; 

cur_dir = opendir(dir); 

if ( null == cur_dir ){ 

printf("open dir faild %s/n", strerror(errno)); 

return ; 

while( null != ( dir_ent=readdir(cur_dir))){ 

if ( 0==strcmp(dir_ent->d_name,".") || 0==strcmp( dir_ent->d_name,"..")){ 

continue; 

sprintf( path, "%s%s",dir,dir_ent->d_name); 

if ( -1 == lstat(path, &dir_stat) ){ 

printf("lstat error %s /n",strerror(errno)); 

return ; 

if ( s_isdir( dir_stat.st_mode) ){                         

strcat(path,"/"); 

printf("path: %s/n",path); 

iterate_dir(path); 

continue; 

printf("file: %s /n", path); 

linux程式設計之檔案與目錄

有興趣的朋友可以訪問我的 檔案有關的資訊結構 struct stat 檔案型別 linux系統中的常見檔案型別有 普通檔案 目錄檔案 字元特殊檔案 提供對裝置不帶緩衝的訪問 塊特殊檔案 提供對裝置帶緩衝的訪問 fifo檔案 用於程序間的通訊,命名管道 套介面檔案 用於網路通訊 檔案型別的判斷 使用如...

Linux 環境程式設計之檔案I O 檔案讀寫

函式介面 includessize t read int fd,void buf,size t nbytes ssize t write int fd,const void buf,size t nbytes read使用 write使用 測試 include include include inc...

linux程式設計之檔案I O

linux下c語言對於檔案的操作,我們會經常用到fopen fclose fwrite fread fgets 等一系列庫函式,基本和是和windows下學習c語言一樣的,其實這些庫函式就是在linuxx下對系統呼叫函式的封裝,因此這裡只介紹系統函式下的檔案操作函式。一 open 開啟檔案 incl...