C語言目錄和檔案操作擴充套件

2021-10-04 07:13:19 字數 4337 閱讀 3840

三、utime庫函式

四、rename庫函式

五、remove庫函式

六、課後作業

本章節擴充套件一些目錄和檔案操作的更多知識,因為這些知識涉及到時間操作,所以放在時間操作之後的章節中介紹。

access函式用於判斷當前作業系統使用者對檔案或目錄的訪問許可權。

包含標頭檔案:

#include

函式宣告:

int

access

(const

char

*pathname,

int mode)

;

引數說明:

pathname檔名或目錄名,可以是當前目錄的檔案或目錄,也可以列出全路徑。

mode 需要判斷的訪問許可權。在標頭檔案unistd.h中的預定義如下:

#define r_ok 4     

// r_ok 只判斷是否有讀許可權

#define w_ok 2

// w_ok 只判斷是否有寫許可權

#define x_ok 1

// x_ok 判斷是否有執行許可權

#define f_ok 0

// f_ok 只判斷是否存在

返回值:

當pathname滿足mode的條件時候返回0,不滿足返回-1。

在實際開發中,access函式主要用於判斷檔案或目錄是否是存在。

struct stat結構體用於存放檔案和目錄的狀態資訊,如下:

struct stat

;

struct stat結構體的成員變數比較多,對程式設計師來說,重點關注st_mode、st_size和st_mtime成員就可以了。注意st_mtime是乙個整數表達的時間,需要程式設計師自己寫**轉換格式。

st_mode成員的取值很多,或者使用如下兩個巨集來判斷。

s_isreg (st_mode) 是否為一般檔案 

s_isdir (st_mode) 是否為目錄

包含標頭檔案:

#include

#include

#include

函式宣告:

int

stat

(const

char

*path,

struct stat *buf)

;

stat函式獲取path指定檔案或目錄的資訊,並將資訊儲存到結構體buf中,執行成功返回0,失敗返回-1。

示例(book145.c)

/*

* 程式名:book145.c,此程式演示目錄和檔案的訪問許可權和狀態資訊

*/#include

#include

#include

// 本程式執行要帶乙個引數,即檔案或目錄名

intmain

(int argc,

char

*ar**)

if(access

(ar**[1]

,f_ok)!=0

)struct stat ststat;

// 獲取檔案的狀態資訊if(

stat

(ar**[1]

,&ststat)!=0

)return-1

;if(s_isreg

(ststat.st_mode)

)printf

("%s是乙個檔案。\n"

,ar**[1]

);if(

s_isdir

(ststat.st_mode)

)printf

("%s是乙個目錄。\n"

,ar**[1]);}

執行效果

utime函式用於修改檔案的訪問時間和更改時間。

包含標頭檔案:

#include

函式宣告:

int

utime

(const

char

*filename,

const

struct utimbuf *times)

;

函式說明:utime()用來修改引數filename 檔案所屬的inode訪問時間。如果引數times為空指標(null),

則該檔案的訪問時間和更改時間全部會設為目前時間。結構utimbuf 定義如下:

struct utimbuf

;

返回值:執行成功則返回0,失敗返回-1。

rename函式用於重新命名檔案或目錄,相當於作業系統的mv命令,對程式設計師來說,在程式中極少重新命名目錄,但重新命名檔案是經常用到的功能。

包含標頭檔案:

#include

函式宣告:

int

rename

(const

char

*oldpath,

const

char

*newpath)

;

引數說明:

oldpath 檔案或目錄的原名。

newpath 檔案或目錄的新的名稱。

返回值:0-成功,-1-失敗。

remove函式用於刪除檔案或目錄,相當於作業系統的rm命令。

包含標頭檔案:

#include

函式宣告:

int

remove

(const

char

*pathname)

;

引數說明:

pathname 待刪除的檔案或目錄名。

返回值:0-成功,-1-失敗。

1)繼續豐富您的函式庫,用mkdir建立目錄的時候,例如mkdir("/tmp/aaa/bbb/ccc",0755);,如果上級目錄不存在(/tmp/aaa或/tmp/aaa/bbb不存在),是無法建立/tmp/aaa/bbb/ccc目錄的,這不是程式設計師想要的,我們要再寫乙個函式,如果上級目錄不存在,就建立上級目錄,一級一級的建立,函式的宣告如下:

int

mkdir

(const

char

*pathname)

;

2)編寫乙個獲取檔案時間的函式,宣告如下:

// 獲取檔案的時間,即modtime

void

filemtime

(const

char

*in_fullfilename,

char

*out_modtime)

;

out_modtime的格式是"yyyy-mm-dd hh24:mi:ss"。

3)編寫乙個獲取檔案大小的函式,宣告如下:

// 獲取檔案的大小,返回位元組數

intfilesize

(const

char

*in_fullfilename)

;

4)rename函式有乙個不足,如果目標檔名目錄newpath的上級目錄不存在,函式返回失敗,重寫乙個新的rename函式,如果newpath的上級目錄不存在,先建立newpath的上級目錄,再rename,函式的宣告如下:

int

rename

(const

char

*oldpath,

const

char

*newpath)

;

5)utime函式的第二個引數是乙個結構體utimbuf,不方便使用,在實際開發中,我們更希望是乙個字串格式的時間,如:「2019-02-08 12:05:02」,重寫乙個utime函式,功能與utime相同,但是把第二個引數改為字串格式的時間,函式的宣告如下:

int

utime

(const

char

*filename,

const

char

*strtime)

;

C 操作目錄和檔案

1 通過path類的combine方法可以合併路徑。string activedir c mydir string newpath system.io.path.combine activedir,mysubdirone 2 目錄的建立。建立目錄時如果目錄已存在,則不會重新建立目錄,且不會報錯。建立...

C 操作目錄和檔案

1 通過path類的combine方法可以合併路徑。string activedir c mydir string newpath system.io.path.combine activedir,mysubdirone 2 目錄的建立。建立目錄時如果目錄已存在,則不會重新建立目錄,且不會報錯。建立...

Linux C語言操作檔案目錄和檔案

qq群 852283276 b站 主頁 linux c 遍歷目錄及檔案 linux c 遍歷目錄及目錄下檔案 獲取檔案屬性 stat lstat fstat linux c語言遍歷資料夾所有檔案 stat與lstat的區別,當乙個檔案是符號鏈結時,lstat返回的是該符號鏈結本身的資訊,stat返回...