目录与链接

创建和移除(硬)链接

#include<unistd.h>
int link(const char *oldpath,const char *newpath)//如果oldpath是符号链接,该函数不会对其解引用
int unlink(const char *pathname)//也不会解引用

//更改文件名
int rename(const char *oldpath,const char *newpath) //既可以重命名文件,也能移动文件
int symlink(const char *flilepath,const char *linkpath)     使用符号链接
size_t readlink(const char *pathname,char *buffer,size_t bufsize)       将符号链接字符串的一份副本置于buffer指向的字符串中

//创建和移除目录
#include<sys/stat.h>
int mkdir(const char *pathname,mode_t mode) 如果需要递归建立文件需要加选项-p
int rmdir(const char *pathname)     要删除的目录须为空,也不会解引用
int remove(const char *pathname)        删除一个文件(调用unlink)或者空目录(调用rmdir)

读目录

#include<dirent.h>
DIR *opendir(const char *dirpath)
DIR *fdopendir(int fd)

stuct dirent *readdir(DIR *dirp)    从一个目录流中读取连续的条目,结果未经排序
struct dirent{
ino_t d_ino;    文件节点
char d_name[];      文件名称
};

void rewinddir(DIR *dirp)   将目录流移到起点
int closedir(DIR *dirp)     关闭处于打开状态的目录流关闭,同时释放流所用资源
int dirfd(DIR *dirp)    返回dirp目录流相关联的文件描述符,传到fchdir()即可改变当前工作目录
int fchdir(int fd);

int readdir_r(DIR *dirp,struct dirent *entry,struct dirent **result)    使用目录流,可重入

文件树遍历

#include<ftw.h>
int nftw(const char *dirpath,int(*func)(const char *pathname,const struct stat *statbuf,int typeflag,struct FTW *ftwbuf),int nopenfd,int flags) 
为目录数树中的每个文件调用一次由程序员定义func函数
nopenfd指定文件描述符数量的最大值,如果目录树深度超过这个值,那么nftw在做好记录的前提下,关闭并重新打开描述符
flags参数可以为下列的值
每次调用fcunc都必须返回一个整型值,由nftw()加以解释,如果返回0,nftw()会继续对书进行遍历,nftw返回非0时停止遍历,并且nftw()也会返回相同的非0值
FTW_CHDIR   处理目录内容之前先调用chdir()进入每个目录
FTW_DEPTH   对目录树执行后序遍历,这意味着,nftw()会在对目录本身执行func之前先对目录中的所有文件爱你及其子目录执行func调用
FTW_MOUNT   不会越界进入另一文件系统,如果树中某一子目录是挂载点,那么不会对其进行遍历
FTW_PHYS    默认情况下,nftw()对符号链接进行解引用,设置该标志之后,就不会进行解引用
typeflags的值可为下列值
FTW_D       这是一个目录
FTW_DNR     这是一个不能读取的目录,nftw()不能遍历其后代
FTW_DP      对一个目录进行后序遍历
FTW_F       该文件类型是出目录和符号链接外的任何类型
FTW_NS      对该文件调用stat()失败
FTW_SL      这是一个符号链接,仅当使用FTW_PHYS标志嗲用nftw()函数是才返回该值
FTW_SLN     悬空的符号链接,只有没有指定FTW_PHYS标志时才会返回该值
其中
struct FTW{
int base;   //最后一个/字符之后的部分的整型偏移量
int level;  //该条目相对与便利起点(level为0)的深度
};
FTW_CONTINUE        与传统func()函数返回0一样,继续处理目录树中的条目
FTW_SKIP_SIBLINGS   不再进一步处理当前目录中的条目,恢复对父目录的处理
FTW_SKIP_SUBTREE    如果pathname是目录即typeflag是FTW_D,那么不对该目录下的条目嗲用func(),回复对该目录的下一个同级目录的处理
FTW_STOP        与传统func函数返回非0值一样,不再进一步处理目录树下的任何条目,nftw将返回FTW_STOP给调用者
//获取当前工作目录
char *getcwd(char *cwdbuf,size_t size)  将内含当前工作目录绝对路径的字符串置于cwdbuf中,其空间至少为size
//改变当前工作目录
int chdir(const char *pathname)
int fchdir(int fd)

//改变进程的根目录
#include<unistd.h>
int chroot(const char *pathname)    所有绝对路径名的解释都将以该文件系统的pathname位置作为起点,这会将应用程序限定与文件系统的特定区域,成为设立一个chroot监禁区,尽管如此,chroot系统调用也并非完全安全

这里写图片描述

//解析路径名,将所有符号链接意义解除引用,变成绝对路径
#include<stdlib.h.
char *realpath(const char *pathname,char *resolved_path)

//解析路径名字符串
#include<libgen.h>
char *dirname(char *pathname);  //目录
char *basename(char *pathname); //文件名

posted on 2017-10-25 18:06  标配的小号  阅读(324)  评论(0编辑  收藏  举报

导航