目录与链接
创建和移除(硬)链接
#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); //文件名