用c语言自己编写一个展示当前目录下所有目录的程序
Hello,大家好我是刘傲天,今天带大家来写一个程序,这一节我们用c语言,是因为linux的接口都是c语言编写的,想看源码直接跳到最下方。
需要的头文件
- stdio.h
- dirent.h
- types.h
第一个是标准的输入输出头文件,要把信息展示出来所以导入
第二个和第三个是opendir所需要的两个头文件,所以我们一并导入进来
思路
man -k dir | grep 3
在输出的信息中,我们可以很清晰很快速的找到opendir readdir这两个字眼,然后我们查看一下opendir这个接口
man 3 opendir
可以看到opendir的接口是传入一个char *类型的变量,然后返回的是一个DIR的结构体,这样就可以打开一个目录。
打开之后就是读取了嘛,获得了打开之后的目录结构体,那就readdir一下
man 3 readdir
可以清晰的看到readdir需要一个参数 DIR类型的指针,返回的则是struct dirent的结构体,这个结构体里则包含着文件信息。
struct dirent {
ino_t d_ino; /* Inode number */
off_t d_off; /* Not an offset; see below */
unsigned short d_reclen; /* Length of this record */
unsigned char d_type; /* Type of file; not supported
by all filesystem types */
char d_name[256]; /* Null-terminated filename */
};
所以就写代码咯
实现
首先导入基本头文件和c框架
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
int main(int argc, char* argv[]){
return 0;
}
读取目录,之前说过需要DIR结构体和struct dirent结构体
// 创建变量
DIR *dir_ptr;
struct dirent * direntp;
// 打开一个目录,这个目录的地址由命令行参数决定
if ((dir_ptr = opendir(argv[1])) == NULL){
perror(argv[1]);
}
else{
/* 成功打开就读取目录 */
while ((direntp = readdir(dir_ptr)) != NULL){
/* 将读取的内容传递给direntp变量,然后判断这个文件的类型等不等于DT_DIR 相等说明是目录*/
if (direntp->d_type == DT_DIR){
/* 如果成功匹配就打印出来 */
printf("%s\n", direntp->d_name);
}
}
/* 处理完之后就关掉这个目录 */
closedir(dir_ptr);
}
源码
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
int main(int argc, char* argv[]){
DIR *dir_ptr;
struct dirent * direntp;
if ((dir_ptr = opendir(argv[1])) == NULL){
perror(argv[1]);
}
else{
while ((direntp = readdir(dir_ptr)) != NULL){
if (direntp->d_type == DT_DIR){
printf("%s\n", direntp->d_name);
}
}
closedir(dir_ptr);
}
return 0;
}