1. 程式人生 > >POSIX檔案及目錄管理

POSIX檔案及目錄管理

 在linux作業系統中,實現了兩類對檔案IO的管理,一類是遵循POSIX標準,linux作業系統自身提供的IO系統呼叫,如open、close、read等函式;另一類是由ANSI標準提供的標準IO庫函式,這些函式是對直接IO系統呼叫的封裝,其在訪問檔案時根據需要設定了不同型別的緩衝區,從而減少了直接IO系統呼叫的次數,提高訪問效率。

1、  檔案流與檔案描述符的區別:

使用ANSI C函式fopen開啟的檔案對應一個流檔案,任何程序在執行的時候,都預設打開了3個流物件。對於使用者空間來說,任何開啟的檔案都將被分配一個唯一非整數,用於標識該開啟檔案,該值即檔案描述符。

2、  檔案描述符與檔案流的轉換操作:

Linux為使用者層提供了函式fileno()以從檔案流中讀取其檔案描述符,即獲得struct FILE的_fileno成員

Int fileno (FILE *_stream) 此函式以某個流物件為引數,返回該流的檔案描述符值。

FILE  *fdopen(int _fd,_const char *_modes) 此函式第一個引數為一個檔案描述符,第2個引數為封裝該流的許可權。

3、  POSIX標準下檔案IO管理:

1)、開啟檔案

  Int open(_const char *file,int _oflag,…) 第1個引數為欲開啟檔案的路徑,第2個引數為開啟檔案的方式,第3個引數可有可無,自動建立該檔案,它規定了檔案的許可權。

2)、關閉檔案

  Int close(int _fd)關閉檔案,將相應的內容全部寫回檔案中,即讓資料寫回磁碟。

3)、建立檔案

Int creat(_const char *_file,_mode_t _mode) 第1個引數為欲建立檔案的路徑,第2個引數為該檔案的訪問許可權。

4)、檔案控制

 Int fcntl(int _fd,int _cmd) 第1個引數fd為欲修改屬性的檔案描述符,第2個引數cmd為相應的操作,常用命令如下:

#define F_DUPFD   0    //複製檔案描述符

#define F_GETFD   1    //獲得檔案描述符標誌

#define F_SETFD   2    //設定檔案描述符標誌

#define F_GETFL   3    //獲取檔案狀態

#define F_SETFL   4    //設定檔案狀態

5)、讀檔案內容

 Ssize_t  read (int _fd,void *_buf,size_t _nbytes)

從引數fd所指的檔案中讀取_nbytes資料到buf指標所指的記憶體中。

6)、寫內容到檔案

 Ssize_t write (int _fd , _const void *_buf , size_t _n)

將buf為起始地址的緩衝區前n個位元組寫入與開啟檔案描述符fd關聯的檔案內。

7)、檔案定位

_off_t lseek(int _fd , _off_t _offset , int _whence)

第1個引數為已經開啟的檔案,第2個引數offset為位移數,第3個引數為參考點。

8)、同步核心緩衝區

為了保證磁碟上實際檔案系統與快取中的內容的一致性,sync、fsync和fdatasync系統呼叫可以更新緩衝區。

Void sync(void)   將所有修改寫的塊的快取排入寫佇列,然後返回,不等待實際IO操作結束。

Int fsync(int fildes) 等待IO結束,然後返回,多用於於資料庫相關的應用程式,它確保修改過的塊立即寫到磁碟上。

Int fdatasync(int fildes)  只更新內容。

4、  目錄檔案基本操作

1)、開啟目錄檔案

DIR *opendir(const char *dirname) 開啟路徑為dirname 的目錄,並使一個目錄流與它相關聯。

2)、關閉目錄檔案

int closedir(DIR *dirp)  關閉指定的目錄流,然後釋放與DIR指標關聯的結構

3)、讀目錄內容

Struct dirent *readdir(DIR *dirp)  讀取該目錄下的檔案列表,該函式的返回型別為struct dirent。

Int readdir_r (DIR *dirp ,struct dirent *entry, struct dirent **result) 實現多執行緒讀取目錄內容操作

4)、定位目錄位置

Long int telldir(DIR *dirp) 目錄流相關聯的當前位置

Void seekdir(DIR *dirp , long int loc) 類似於檔案定位函式fseek(),在目錄流上設定下一個readdir()操作的位置。

5)、新增刪除目錄

Int mkdir(_const char *_path, _mode_t _mode) 第1個引數為欲建立的目錄檔案路徑,

第2個引數為該目錄的訪問許可權

Int rmdir(_const char *_path) 引數為欲刪除目錄的位置

6)、當前工作路徑操作

a)、獲取當前工作路徑

char *getcwd (char *_buf , size_t _size) //獲取當前工作路徑到buf中,

如果設定buf為NULL,getcwd()將利用malloc()獲取空間,在此情況下,由getcwd()返回的指標需要被釋放。

Char *get_current_dir_name(void) 返回當前絕對路徑

b)、修改當前工作路徑

int chdir (_const char *_path)  //修改程序工作路徑,引數為目錄路徑