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实例

相关文章
相关标签/搜索