[Linux] Linux 用c语言自己编写一个展示当前目录下所有目录的程序 - 刘傲天

in VimUbuntu with 0 comment

用c语言自己编写一个展示当前目录下所有目录的程序

Hello,大家好我是刘傲天,今天带大家来写一个程序,这一节我们用c语言,是因为linux的接口都是c语言编写的,想看源码直接跳到最下方。

需要的头文件

第二个和第三个是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;       
}     
Responses