1、目录操作函数
mkdir:创建目录
rmdir:删除目录
rename:对目录重命名
chdir:修改进程的工作目录
getcwd:获取当前目录路径
1.1 mkdir
/*
#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char *pathname, mode_t mode);
作用:创建一个目录
参数:
pathname: 创建的目录的路径
mode: 权限,八进制的数
返回值:
成功返回0, 失败返回-1
*/
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
int main() {
int ret = mkdir("aaa", 0777);
if(ret == -1) {
perror("mkdir");
return -1;
}
return 0;
}
1.2 rmdir
#include <unistd.h>
int rmdir(const char* pathname)
作用:删除目录
参数:
pathname:删除的文件路径
返回值:
成功:0
失败:-1,返回errno
1.3 rename
/*
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);
作用:目录重命名
参数:
oldpath:旧名
newpath:新名
返回值:
成功:0
失败:-1,返回errno
*/
#include <stdio.h>
int main() {
int ret = rename("aaa", "bbb");
if(ret == -1) {
perror("rename");
return -1;
}
return 0;
}
1.4 chdir
#include <unistd.h>
int chdir(const char* path)
作用:修改工作目录
参数:
path:需要修改的文件路径
返回值:
成功:0
失败:-1,返回errno
1.5 getcwd
#include <unistd.h>
char* getcwd(char* buf, size_t size)
作用:取得当前的工作目录
参数:
buf:存储路径,指向一个数组
size:数组的大小
返回值:
返回指向这个数组的指针,就是目录地址
2、目录遍历函数
opendir:打开一个目录
readdir:读取目录
closedir:关闭一个目录
dirent结构体和d_type
/*
// 打开一个目录
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
参数:
- name: 需要打开的目录的名称
返回值:
DIR * 类型,理解为目录流
错误返回NULL
// 读取目录中的数据
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
- 参数:dirp是opendir返回的结果
- 返回值:
struct dirent,代表读取到的文件的信息
读取到了末尾或者失败了,返回NULL
// 关闭目录
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
*/
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int getFileNum(const char * path);
// 读取某个目录下所有的普通文件的个数
int main(int argc, char * argv[]) {
if(argc < 2) {
printf("%s path\n", argv[0]);
return -1;
}
int num = getFileNum(argv[1]);
printf("普通文件的个数为:%d\n", num);
return 0;
}
// 用于获取目录下所有普通文件的个数
int getFileNum(const char * path) {
// 1.打开目录
DIR * dir = opendir(path);
if(dir == NULL) {
perror("opendir");
exit(0);
}
struct dirent *ptr;
// 记录普通文件的个数
int total = 0;
while((ptr = readdir(dir)) != NULL) {
// 获取名称
char * dname = ptr->d_name;
// 忽略掉. 和..
if(strcmp(dname, ".") == 0 || strcmp(dname, "..") == 0) {
continue;
}
// 判断是否是普通文件还是目录
if(ptr->d_type == DT_DIR) {
// 目录,需要继续读取这个目录
char newpath[256];
sprintf(newpath, "%s/%s", path, dname);
total += getFileNum(newpath);
}
if(ptr->d_type == DT_REG) {
// 普通文件
total++;
}
}
// 关闭目录
closedir(dir);
return total;
}