linux系统函数学习_(6)目录操作函数chdir函数与getcwd函数、mkdir函数与rmdir函数、opendir函数、readdir函数及closedir函数
chdir()函数
修改当前进程的路径
int chdir(const char *path);
getcwd()函数
获取当前进程工作目录
char *getcwd(char *buf, size_t size);
chdir()函数与getcwd()函数结合在一起使用理解
示例
// chdir_getcwd.c
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
if(argc < 2)
{
printf("a.out dir\n");
exit(1);
}
int ret = chdir(argv[1]);
if(ret == -1)
{
perror("chdir");
exit(1);
}
int fd = open("chdir.txt", O_CREAT | O_RDWR, 0777);
if(fd == -1)
{
perror("open");
exit(1);
}
close(fd);
char buf[128];
getcwd(buf, sizeof(buf));
printf("current dir: %s\n", buf);
return 0;
}
mkdir()函数
创建目录 - -注意:创建的目录需要有执行权限,否则无法进入目录
int mkdir(const char *pathname, mode_t mode);
示例
// mkdir.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char* argv[])
{
if(argc < 3)
{
printf("a.out newDir mode\n");
exit(1);
}
int mode = strtol(argv[2], NULL, 8);
int ret = mkdir(argv[1], mode);
if(ret == -1)
{
perror("mkdir");
exit(1);
}
return 0;
}
rmdir()函数
删除一个空目录
int rmdir(const char *pathname);
opendir()函数
打开一个目录
DIR *opendir(const char *name);
返回值:DIR结构指针,该结构是一个内部结构,保存所打开的目录信息,作用类似于FILE结构,函数出错返回NULL
readdir()函数
读取目录
struct dirent *readdir(DIR *dirp);
返回一条记录项:
struct dirent
{
ino_t d_ino; // 此目录进入点的inode
off_t d_off; // 目录文件开头至此目录进入点的位移
unsigned short int d_reclen; // 文件的长度, 不包含NULL字符
unsigned char d_type; // 所指的文件类型
char d_name[256]; // 以NULL结尾的文件名
};
d_type: DT_BLK-块设备 DT_CHR-字符设备 DT_DIR-目录 DT_LNK-软连接 DT_FIFO-管道 DT_REG-普通文件 DT_SOCK-套接字 DT_UNKNOWN-未知
closedir()函数
关闭目录
int closedir(DIR *dirp);
示例
// opendir_readdir_closedir.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
int getFileNum(char* root)
{
// 打开目录
DIR* dir = opendir(root);
if(dir == NULL)
{
perror("opendir");
exit(0);
}
// 读目录
int total = 0;
char path[1024] = {0};
struct dirent* ptr = NULL;
while((ptr = readdir(dir)) != NULL)
{
// 跳过 . 和 ..
if(strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0)
{
continue;
}
// 判断是不是文件
if(ptr->d_type == DT_REG)
{
total ++;
}
// 如果是目录
if(ptr->d_type == DT_DIR)
{
// 递归读目录
sprintf(path, "%s/%s", root, ptr->d_name);
total += getFileNum(path);
}
}
closedir(dir);
return total;
}
int main(int argc, char* argv[])
{
// 读目录, 统计文件个数
int total = getFileNum(argv[1]);
// 打印
printf("%s has file number: %d\n", argv[1], total);
return 0;
}
参考
参考黑马程序员linux系统编程资料