chdir
修改当前进程路径;
- SYNOPSIS:
#include <unistd.h> int chdir(const char *path);
- DESCRIPTION:
path
:要改变的工作目录,作用类似 cd 命令;
- RETURN VALUE:
成功返回0,失败返回-1;
getcwd
获取当前进程工作目录;
- SYNOPSIS:
#include <unistd.h> char *getcwd(char *buf, size_t size);
- DESCRIPTION:
buf
:保存获取到的目录;size
:给定buf的大小;
- RETURN VALUE:
成功返回0,失败返回-1;
rmdir
- SYNOPSIS:
删除一个空目录;#include <unistd.h> int rmdir(const char *pathname);
- DESCRIPTION:
pathname
:指定删除的目录;
- RETURN VALUE:
成功返回0,失败返回-1;
opendir
打开一个目录;
-
SYNOPSIS:
#include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name);
-
DESCRIPTION:
name
:指定要打开的目录;
-
RETURN VALUE:
如果打开成功了返回一个 DIR 指针,该结构是一个内部结构,类似 FILE 结构体;打开失败返回NULL;
readdir
readdir可以用来遍历指定目录路径下的所有文件。不过,不包含子目录的子文件,如果要递归遍历,可以使用深度遍历,或者广度遍历算法;
- SYNOPSIS:
#include <dirent.h> struct dirent *readdir(DIR *dirp);
- DESCRIPTION:
- `dirp:打开目录时返回的 DIR 指针;
- RETURN VALUE:
如果读取成功会返回 struct dirent 指针,可以判断文件的类型,如果读取完成最终会返回NULL; - dirent 结构体:
struct dirent { ino_t d_ino; /* 目录进入点 */ off_t d_off; /* 目录文件开头至此目录进入点的位移 */ unsigned short d_reclen; /* d_name的长度 */ unsigned char d_type; /* d_name所指的文件类型 */ char d_name[256]; /* 文件名 */ }; /* d_type: DT_BLK This is a block device. DT_CHR This is a character device. DT_DIR This is a directory. DT_FIFO This is a named pipe (FIFO). DT_LNK This is a symbolic link. DT_REG This is a regular file. DT_SOCK This is a UNIX domain socket. DT_UNKNOWN The file type is unknown. */
- 遍历基本模型
int getFile(char *baseDir) { DIR *dirp; struct dirent* dp; // 打开目录 if ((dirp = opendir(base_dir)) == NULL) { perror("opendir error"); return -1; } // 开始遍历 while ((dp = readdir(dirp)) != NULL) { // 忽略当前目录"."和上一级目录".." if (0 == strcmp(dp->d_name, ".") || 0 == strcmp(dp->d_name, "..")) continue; // 读取文件类型 char type[50]; switch (dp->d_type) { case DT_DIR: //如果深度遍历目录下的子目录,这里要用递归算法 break; case DT_REG: breeak; case DT_BLK: break; case DT_CHR: break; case DT_FIFO: break; case DT_LNK: break; case DT_SOCK: break; default: break; } } // 关闭目录 closedir(dirp); return 0; }
closedir
关闭一个目录;
-
SYNOPSIS:
#include <sys/types.h> #include <dirent.h> int closedir(DIR *dirp);
-
DESCRIPTION:
dirp
:指定要关闭的目录;
-
RETURN VALUE:
成功返回0,失败返回-1;
dup/dup2
文件描述符的复制(两个文件描述符对应同一个文件);
- SYNOPSIS:
#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd);
- DESCRIPTION:
oldfd
:旧的文件描述符;newfd
:oldfd 和 newfd 指向的是不同的文件,在拷贝前先关掉newfd,然后oldfd复制给newfd 并返回 newfd。如果oldfd 和newfd 是同一个文件描述符,则不会关掉newfd 直接返回 newfd 。
- RETURN VALUE:
dup返回文件描述符表中没有被占用的最小的文件描述符。dup2会返回newfd;
fcntl
可以改变打开文件的属性;
- SYNOPSIS:
- 复制一个现有的描述符(F_DUPFD)。与dup函数功能一样,复制由fd指向的文件描述符,调用成功后返回新的文件描述符,与旧的文件描述符共同指向同一个文件。
- 获得/设置文件描述符的标记
- F_GETFD
- F_SETFD
- 获得/设置文件状态标记:
- F_GETFL:使用GET命令时,第三个参数设置为0,使用变量接收函数返回值
- O_RDONLY:只读打开;
- O_WRONLY:只写打开;
- O_RDWR:读写打开;
- O_EXEC:执行打开;
- O_SEARCH:搜索打开目录;
- O_APPEND:追加写
- O_NONBLOCK:非阻塞模式;
- F_SETFL(以下可更改的几个标识):通常先F_GETFL获取flag,然后(|=)新的标志作为第三个参数
- O_APPEND
- O_NONBLOCK
- F_GETFL:使用GET命令时,第三个参数设置为0,使用变量接收函数返回值
- 获得/设置异步I/O所有权
- F_GETOWN
- F_SETOWN
- 获得/设置记录锁
- F_GETLK
- F_SETLK
- F_SETLKW
#include<unistd.h> #include<fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd ,struct flock* lock);