程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [APUE]文件和目錄(下),apue文件目錄

[APUE]文件和目錄(下),apue文件目錄

編輯:關於C語言

[APUE]文件和目錄(下),apue文件目錄


一、mkdir和rmdir函數

#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
返回值:成功0,失敗-1.

mkdir函數創建一個空目錄,.和..目錄是自動創建的。所指定的文件存取許可權mode由進程的文件方式創建屏蔽字修改(命令行執行umask可查看) 常見的錯誤是指定與文件相同的mode(只指定讀,寫許可權)。但是對於目錄來說必須設置一個執行許可權位,以允許存取該目錄中的文件名。

用rmdir函數可以刪除一個目錄

#include <unistd.h>
int rmdir(const char *pathname);

如果調用此函數使目錄的連接計數為0並且沒有其他進程打開該目錄,則釋放此目錄占用的空間。如果在連接計數為0時,有一個或多個進程打開了該目錄,則在此函數返回前刪除最後一個連接及.和..項。並且,在此目錄中不能再創建新文件。但是在最後一個進程關閉它之前並不釋放此目錄(即使有進程打開該目錄,它們在此目錄下,也不能執行其他操作,因為使rmdir函數成功執行,該目錄必須是空的)。

二、讀目錄

對某個目錄具有存取許可權的任一用戶都可讀該目錄,但是只有內核才能寫目錄(防止文件系統發生混亂)。一個目錄的寫許可權和執行許可權決定了能否在該目錄中創建文件和刪除文件,但是它們並不表示可以讀寫文件本身。 目錄的實際格式依賴於UNIX的具體實現,早期的系統,如V7結構:每個目錄項是16個字節,其中14個字節是文件名,2個字節是i節點編號數。UNIX現在包含了一套與讀目錄相關的例程,他們是POSIX.1的一部分。

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *pathname); 返回值:成功則為指針,出錯則返回NULL

struct dirent *readdir(DIR *dp); 返回值:成功則為指針,若在目錄尾或出錯則為NULL

void rewinddir(DIR *dp); 該函數用來設置參數dir 目錄流目前的讀取位置為原來開頭的讀取位置

int closedir(DIR *dp);
返回值:成功0,失敗-1

定義在頭文件<dirent.h>中的dirent結構與實現有關,SVR4和4.3+BSD定義此結構至少包含下列兩個成員:

struct dirent{
  ino_t d_ino;    /* i-node number */
  char d_name[NAME_MAX+1]; /* null-terminated filename */
}

POSIX.1並沒有定義d_ino,因為這是一個實現特征,POSIX.1在此結構中之定義d_name項

SVR4沒有將NAME_MAX定義為一個常數--其值依賴於目錄所在的文件系統。並且通常可用fpathconf函數取得。在BSD類文件系統中,NAME_MAX的常用值是255.但是文件名是以null字符結束的,所以在頭文件如何定義數組d_name並無多大關系 DIR是一個內部結構類似於FILE。 opendir執行初始化操作,使第一個readdir讀目錄中的第一個目錄項,目錄中各目錄項的順序與實現有關,它們通常並不按字母順序排列。 以下是一個簡單的文件遍歷程序:

三、chdir、fchdir和getcwd函數

每個進程都有一個當前工作目錄,此目錄是搜索所有相對路徑名的起點。

#include <unistd.h>
int chdir(const char *pathname);
int fchdir(int filedes);
返回值:成功0,失敗-1.

因為當前工作目錄是一個進程的屬性,所以它只影響調用chdir的進程本身並不影響其他進程 內核只為每個進程保存當前工作目錄的i節點編號以及設備標識,並不保存該目錄的完整路徑名。getcwd函數可以從當前工作目錄開始,找到其上一級的目錄,然後讀其目錄項,直到該目錄項中的i節點編號數與當前工作目錄i節點編號數相同,這樣就找到了其對應的文件,按照這種方法逐層上移直到遇到根,這樣就得到了當前工作目錄的絕對路徑名。

#include <unistd.h>
char *getcwd(char *buf, size_t size);
返回值:成功buf,失敗NULL

此函數兩個參數,緩存地址buf,緩存的長度size。該緩存必須有足夠的長度一容納絕對路徑名加一個null終止符,否則返回出錯。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved