APUE(4)---文件和目錄 (3)

十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實例

相關文章
相關標籤/搜索