十3、函數rename和renameat函數
#include <stdio.h> int rename(const char *oldname, const char *newname); int renameat(int oldfd, const char *oldname, int newfd, const char *newname);
文件或目錄能夠用rename函數或者renameat函數進行重命名。有幾種狀況須要說明:spa
一、若是oldname指的是一個文件而不是目錄,那麼爲該文件或符號連接重命名。在這種狀況下,若是newname已存在,它不能引用一個目錄。若是newname已存在,並且不是一個目錄,則將該目錄項刪除而後將oldname重命名爲newname。對包含oldname的目錄以及包含newname的目錄,調用進程必須具備寫權限。unix
二、若是oldname指的是一個目錄,那麼爲該目錄重命名。若是newname已存在,則它必須引用一個目錄,並且該目錄應當是一個空目錄。指針
三、若是oldname或newname引用符號連接,則處理符號連接自己,而不是它所引用的文件。rest
四、不能對.和..重命名。code
十4、符號連接及其建立和讀取blog
符號鏈接是對一個文件的間接指針,它與硬連接有所不一樣,硬連接直接指向文件的i節點。引入符號連接的緣由是爲了避開硬連接的一些限制:一、硬連接一般要求鏈接和文件位於同一文件系統中;二、只有超級用戶才能建立只想目錄的硬連接。當使用以名字引用文件的函數時,應當瞭解該函數是否處理符號連接,也就是該函數是否跟隨符號鏈接到達它所連接的文件。如若該函數具備處理符號鏈接的功能,則其路徑名參數引用由符號鏈接指向的文件。不然,一個路徑名參數引用連接自己,而不是由該鏈接指向的文件。進程
#include <unistd.h> int symlink(const char *actualpath, const char *sympath); int symlinkat(const char *actualpath, int fd, const char * sympath); ssize_t readlink(const char *restrict pathname, char *restrict buf, size_t bufsize); ssize_t readlinkat(int fd, const char *restrict pathname. char *restrict buf, size_t bufsize);
建立符號鏈接時,並不要求actualpath已存在,而且,actualpath和sympath並不須要位於同一文件系統中。get
十5、文件的時間及其修改it
unix爲每一個文件維護了三個時間字段:
st_atim :文件數據的最後訪問時間 read -u
st_mtim :文件數據的最後修改時間 write 默認
st_ctim :i節點狀態的最後更改時間 chmod、chown -c
由於i節點中的全部信息和文件的實際內容是分開存放的。修改時間是文件內容最後一次被修改的時間。狀態時間是該文件的i節點一次被修改的時間,咱們說明了不少影響到i節點的操做,如更改文件的訪問權限、更改用戶ID,更改連接數,可是他們並無修改文件的實際內容。系統並不維護對一個i節點最後一次訪問的時間,因此access和stat函數並不更改這3個時間中的任意一個。
一個文件的訪問和修改時間能夠用如下幾個函數更改:
#include <sys/stat.h> int futimens(int fd, const struct timespec times[2]); int utimensat(int fd, const char *path, const struct timespec times[2], int flag);
十6、函數mkdir、mkdirat和rmdir
#include <sys/stat.h> int mkdir(const char *pathnaem, mode_t mode); int mkdirat(int fd, const char *pathname, mode_t mode); #include <unistd.h> int rmdir(const char *pathname);
建立空目錄會本身建立.和..;常見的錯誤是制定與文件相同的mode(只指定讀、寫),可是對於目錄一般至少要設置一個執行權限位,以容許訪問該目錄中的文件名。
十7、讀目錄
對某個目錄具備訪問權限的任一用戶均可以讀該目錄,可是爲了防止文件系統產生混亂,只有內核才能寫目錄。其相關的主要函數:
#include <dirent.h> DIR *opendir(const char *pathname); DIR *fdopendir(int fd); struct dirent * readdir(DIR *dp); void rewinddir( DIR *dp); int closedir(DIR *dp); long telldir(DIR *dp); void seekdir(DIR *dp, long loc);
待補充....
十8、函數chdir、fchdir和getcwd
每一個進程都有一個當前工做目錄,此目錄是搜索全部相對路徑名的起點,進程能夠調用chdir和fchdir來更改當前目錄,須要注意的是當前工做目錄是進程的一個屬性,因此它隻影響調用chdir的金城自己,而不影響其餘進程。
#include <unistd.h> int chdir(const char *pathname); int fchdir(int fd); char * getcwd(char *buf, size_t size);
#include "apue.h" int main(void) { char ptr[1024]; size_t size; if(chdir("/usr/local/lib") < 0) { err_sys("chdir error"); } if(getcwd(ptr, 1024) == NULL) { err_sys("getcwd error"); } printf("cwd = %s\n", ptr); exit(0); }
4-23-24 chdir和getcwd實例