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,如需转载请自行联系原作者


相关文章
|
3月前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
108 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
4月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
252 18
|
4月前
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
208 5
|
5月前
|
Web App开发 网络协议 Linux
【Linux】网络基础
TCP/IP五层模型是网络通信的基础框架,将复杂的数据传输过程分为物理层、数据链路层、网络层、传输层和应用层,每层各司其职,协同完成远程通信。该模型确保了不同设备和网络之间的互联互通,是现代互联网运行的核心机制。
321 5
|
5月前
|
存储 数据管理 Linux
区分Linux中.tar文件与.tar.gz文件的不同。
总之,".tar"文件提供了一种方便的文件整理方式,其归档但不压缩的特点适用于快速打包和解压,而".tar.gz"文件通过额外的压缩步骤,尽管处理时间更长,但可以减小文件尺寸,更适合于需要节约存储空间或进行文件传输的场景。用户在选择时应根据具体需求,考虑两种格式各自的优劣。
752 13
|
6月前
|
安全 Linux
Linux赋予文件000权限的恢复技巧
以上这些步骤就像是打开一扇锁住的门,步骤看似简单,但是背后却有着严格的逻辑和规则。切记,在任何时候,变更文件权限都要考虑安全性,不要无谓地放宽权限,那样可能
198 16
|
5月前
|
网络协议 Linux 开发者
深入Linux中UDP网络通信机制编程探索
以上步骤概述了Linux中UDP网络通信的编程机制。在实现时,因关注细节和上下文环境可能有所调整,但大致流程是一致的。这些知识片段旨在帮助开发者快速上手Linux下的UDP编程,并提供可靠的信息作为编程的基础。在编程实践中,应结合实际业务需求,设计合适的数据传输协议,确保数据的正确性和实时性。
136 0
|
7月前
|
Linux
【Linux】 Linux文件I/O常见操作技巧
以上就是Linux文件I/O操作的一些技巧,接纳它们,让它们成为你在Linux世界中的得力伙伴,工作会变得轻松许多。不过记住,技巧的运用也需要根据实际情况灵活掌握,毕竟,最适合的才是最好的。
228 28
|
6月前
|
存储 Linux 数据处理
深入剖析Linux中一切即文件的哲学和重定向的机制
在计算机的奇妙世界中,Linux的这套哲学和机制减少了不同类型资源的处理方式,简化了抽象的概念,并蕴藏着强大的灵活性。就像变戏法一样,轻轻松松地在文件、程序与设备之间转换数据流,标准输入、输出、错误流就在指尖舞动,程序的交互和数据处理因此变得既高效又富有乐趣。
107 4
|
7月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
202 18