linux网络编程之面试题----------统计目录下所有目录和文件个数

简介:

题目如下:

    实现linux下tree的单一功能[只打印目录个数和文件个数(不包含隐藏文件)]


    首选我们介绍几个相关的linux 系统API

    

函数名 函数描述 函数声明
opendir 打开一个目录,成功返回一个DIR*类型指针,失败返回NULL DIR* opendir(const char* name)
readdir 读取打开的目录下的子成员,成功返回结构体指针,否则返回NULL

struct dirent* readdir(DIR* dir) 

closedir 关闭已打开的目录.成功返回0,失败返回-1 int closedir(DIR* dirp)

struct dirent 结构体


#include <dirent.h>      //所需要包含头文件


struct dirent{

    ino_t           d_ino;       //索引[inode]编号

  off_t           d_off;       //在目录文件中的偏移

  unsigned short  d_reclen;    //文件名长度

  unsigned char   d_type;      //文件类型


  char            d_name[256]; //文件名

}


d_type 应对的所有文件类型

    DT_BLK      块设备


       DT_CHR      字符设备


       DT_DIR      目录


       DT_FIFO     有名管道


       DT_LNK      符号链接(软链接)


       DT_REG      普通文件


       DT_SOCK     socket套接字


       DT_UNKNOWN  未知类型



注意事项:

    l.linux目录下有 . 和 .. 分别代表指向当前目录和上一级目录,不处理会造成死循环

    2. 不包含隐藏文件,需要将普通文件以.开头的以忽略处理



代码如下:

    #include <stdio.h>         //输入输出头文件

    #include <stdlib.h>        //eixt()函数头文件

    #include <unistd.h>        //unix标准库头文件

    #include <sys/types.h>     //opendir() closedir() readdir()所需头文件

    #include <dirent.h>        //同上

    #include <string.h>        //字符串常用API头文件

    

    //功能函数 

    //成功返回EXIT_SUCCESS

    //失败返回EXIT_FAILURE

    int myTree(const char* root, unsigned int* const dirs, unsigned int* const files){

        int     ret             = EXIT_SUCCESS;       //返回值

        DIR*    dir             = NULL;    //打开的目录

        char    path[1024]      = { 0 };   //拼接文件相对路径使用

        struct  dirent* ptr     = NULL;    //读取的目录下子成员结构体


        //判断参数

        if(NULL == root || NULL == dirs || NULL == files){

            //错误提示

            printf("func %s err:[NULL == root || NULL == dirs || NULL == files]", __FUNCTION__);

            //直接退出

            ret =  EXIT_FAILURE;

            goto END;

        }


        

        //打开目录

        dir = opendir(root);

        //判断是否打开失败

        if(NULL == dir){

            //友情错误提示

            perror("func tree->opendir error: ");

            ret = EXIT_FAILURE;

            goto END;

        }

        

        //循环遍历目录下的文件成员

        while(NULL != (ptr = readdir(dir))){

            //判断是否是 . 和 .. 目录,或.开头的隐藏文件

            if(0 == strncmp(ptr->d_name, ".", 1) || 0 == strcmp(ptr->d_name, "..")){

                 continue;  //跳过处理 

             }


             //如果是目录

              if(DT_DIR == ptr->d_type){

                    (*dirs)++;         //目录个数+1

                  sprintf(path, "%s/%s", root, ptr->d_name);    

                  myTree(path, dirs, files); 

              }else{

                  (*files)++;

              }

        }

        

    END:

        //判断目录是否已关闭

        if(NULL != dir){

            closedir(dir);

            dir = NULL;

        }
        return ret;

    }


    //主函数

    int main(int argc, char* argv[]){

        unsigned int dirs = 0;         // 统计目录个数

        unsigned int files = 0;        // 统计文件个数

        //判断命令行参数

        if(2 > argc){

            //没有参数,默认统计当前目录下

            myTree(".", &dirs, &files);  

        }

        else{

            int i = 0;

            //多个参数的情况下

            for(i = 1; i < argc; i++){

                myTree(argv[i], &dirs, &files);

            }

        }


        //输出最后统计信息

        printf("%d directories, %d files\n", dirs, files);

        

        return EXIT_SUCCESS;

    }






      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1787156,如需转载请自行联系原作者


相关文章
|
4天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
19 3
|
4天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
16 2
|
8天前
|
存储 Linux Windows
linux常用目录
/sbin s就是super User的意思,这里存放的是系统管理员使用的系统管理程序。 /home 存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一版该目录名是以用户的账号命名的。 /root 该目录为系统管理员,也称为超级权限者的用户主目录。 /lib 系统开机所需要最基本的动态连接共享库,其作用类似于windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。 /etc 所有的系统管理所需要的配置文件和子目录。 /usr 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program fies目录。 /bo
23 2
|
22天前
|
运维 监控 网络协议
|
8天前
|
存储 缓存 NoSQL
希音面试:亿级用户 日活 月活,如何统计?(史上最强 HyperLogLog 解读)
本文详细介绍了如何使用Redis的各种数据结构(如Set、Bitmap、HyperLogLog)来统计网站的日活(DAU)和月活(MAU)用户数。作者通过实际案例和代码示例,系统地讲解了这些数据结构的原理和应用场景,特别是HyperLogLog在处理亿级用户数据时的优势。文章还深入解析了HyperLogLog的数学原理和底层数据结构,帮助读者更好地理解和应用这一高效的数据统计工具。此外,文章还提供了多个相关面试题和参考资料,适合准备面试的技术人员阅读。
|
8天前
|
Linux Python
Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
在 Linux 系统中,了解目录下的文件数量是常见的需求。本文介绍了多种方法,包括使用 `ls` 和 `wc` 命令组合、`find` 命令、`tree` 命令以及编程方式(如 Python)。无论你是新手还是有经验的用户,都能找到适合自己的方法。掌握这些技巧将提高你在 Linux 系统中的操作效率。
18 4
|
13天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
36 2
|
23天前
|
Linux 开发工具 Perl
Linux命令替换目录下所有文件里有"\n"的字符为""如何操作?
【10月更文挑战第20天】Linux命令替换目录下所有文件里有"\n"的字符为""如何操作?
34 4
|
25天前
|
Ubuntu Linux 虚拟化
Linux虚拟机网络配置
【10月更文挑战第25天】在 Linux 虚拟机中,网络配置是实现虚拟机与外部网络通信的关键步骤。本文介绍了四种常见的网络配置方式:桥接模式、NAT 模式、仅主机模式和自定义网络模式,每种模式都详细说明了其原理和配置步骤。通过这些配置,用户可以根据实际需求选择合适的网络模式,确保虚拟机能够顺利地进行网络通信。
|
1月前
|
Kubernetes 架构师 算法
阿里面试:全国14亿人,统计出重名最多的前100个姓名
文章介绍了如何解决“从全国14亿人的数据中统计出重名人数最多的前100位姓名”的面试题,详细分析了多种数据结构的优缺点,最终推荐使用前缀树(Trie)+小顶堆的组合。文章还提供了具体的Java代码实现,并讨论了在内存受限情况下的解决方案,强调了TOP N问题的典型解题思路。最后,鼓励读者通过系统化学习《尼恩Java面试宝典》提升面试技巧。
阿里面试:全国14亿人,统计出重名最多的前100个姓名

热门文章

最新文章