1. 程式人生 > >[6]Linux檔案程式設計

[6]Linux檔案程式設計

[1]檔案描述符簡介

檔案描述符是一個非負的整數,它是一個索引值,並指向核心中每個程序開啟檔案的記錄表。當開啟一個現存檔案或建立一個新檔案時,核心就向程序返回一個檔案描述符,當需要讀/寫檔案時,也需要把檔案描述符作為引數傳遞給相應的函式。
通常,一個程序啟動時,都會開啟3個檔案,標準輸入,標準輸出,標準出錯處理,這3個檔案描述符為STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。

[2]開啟檔案open()

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);

返回值:

檔案描述符,出錯則返回-1。

pathname:

字串,表示被開啟的檔名稱,可以包含路徑。

flags:

為一個或多個標誌,表示檔案的開啟方式。
常用標誌如表所示:

#include<fcntl.h>
O_RDONLY //只讀方式開啟;
O_WRONLY //只寫方式開啟;
O_RDWR  //讀/寫方式開啟;
O_CREAT //如果檔案不存在,就建立新的檔案; O_EXCL //如果使用O_CREAT時檔案存在,則可返回錯誤訊息; O_TRUNC //如果檔案已存在,且以只讀或只寫成功開啟,則先全部刪除檔案中原有的資料; O_APPEND //以新增方式開啟檔案,在開啟檔案的同時,檔案指標指向檔案的末尾.

注意:在open函式中,flags引數可以用過“|”組合而成,O_RDONLY,O_WRONLY,O_RDWR這三種方式是互斥的,不可同時使用,因此這3個引數只能出現一個。

mode:

被開啟檔案的存取許可權模式,當開啟已有檔案時,將忽略這個引數。
檔案模式符號常量:

#include<sys/stat.h>
S_IRWXU   00700   //所屬使用者讀、寫和執行許可權 S_IRUSR   00400   //所屬使用者讀許可權 S_IWUSR   00200   //所屬使用者寫許可權 S_IXUSR   00100   //所屬使用者執行許可權 S_IRWXG  00070   //組使用者讀,寫和執行許可權 S_IRGRP  00040   //組使用者讀許可權  S_IWGRP 00020   //組使用者寫許可權 S_IXGRP  00010   //組使用者執行許可權 S_IRWXO 00007   //其他使用者讀,寫和執行許可權 S_IROTH 00004   //其他使用者讀許可權 S_IWOTH 00002   //其他使用者寫許可權 S_IXOTH 00001   //其他使用者執行許可權

[3]建立檔案 create()

int create(const char *pathname,mode_t mode);
//create函式相當於open的縮寫版本:open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);

[4]關閉檔案close()

int close(int fd);
//傳入引數:fd檔案描述符;
//返回值:若檔案順利關閉則返回0,發生錯誤則返回-1。

[5]讀寫檔案read()/write()

size_t read(int fd, void *buf,size_t count)
size_t write(int fd,const void *buf, size_t count)
//fd:檔案描述符
//buf:指定儲存器獨處資料的緩衝區
//count:指定讀出或寫入的位元組數

函式返回值:如果發生錯誤,那麼返回值為-1,同時設定errno變數為錯誤程式碼,如果操作成功,則返回值是實際讀取或寫入的位元組數。這個位元組數可能小於要求的位元組數count,對於讀操作而言,當檔案所剩的位元組數少於count時,就會出現這種情況,而對於寫操作來說,當磁碟已滿或者某些別的問題時,也會出現這種情況。

[5]檔案偏移函式lseek()

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

函式說明:

每一個已開啟的檔案都有一個讀寫位置, 當開啟檔案時通常其讀寫位置是指向檔案開頭, 若是以附加的方式開啟檔案(如O_APPEND), 則讀寫位置會指向檔案尾. 當read()或write()時, 讀寫位置會隨之增加,lseek()便是用來控制該檔案的讀寫位置. 引數fd為已開啟的檔案描述詞, 引數offset 為根據引數whence來移動讀寫位置的位移數。

whence:

SEEK_SET 引數offset即為新的讀寫位置.
SEEK_CUR 以目前的讀寫位置往後增加offset個位移量.
SEEK_END 將讀寫位置指向檔案尾後再增加offset個位移量.
當whence 值為SEEK_CUR 或SEEK_END 時, 引數offet 允許負值的出現.

返回值:

當呼叫成功時則返回目前的讀寫位置, 也就是距離檔案開頭多少個位元組. 若有錯誤則返回-1, errno 會存放錯誤程式碼。

[6]判斷檔案是否存在access()

#include <unistd.h>
#include <fcntl.h>
int access(const char *pathname, int mode);   

pathname:需要測試的檔案路徑名。
mode:需要測試的操作模式,可能值是一個或多個R_OK(可讀?), W_OK(可寫?), X_OK(可執行?) 或F_OK(檔案存在?)組合體。
返回值: 若所有欲查核的許可權都通過了檢查則返回0值,表示成功,只要有一許可權被禁止則返回-1。