• 一个linux目录扫描程序


     1 #include <unistd.h>
     2 #include <stdio.h>
     3 #include <dirent.h>
     4 
     5 #include <string.h>
     6 #include <sys/stat.h>
     7 #include <stdlib.h>
     8 
     9 void printdir(char * dir, int depth)//这个是主要的打印目录函数,参数dir表征路径,参数depth代表缩进的空格
    10 {
    11     DIR *dp;                    //声明一个DIR *结构的dp
    12     struct dirent *entry;  //声明dirent结构指针entry这个结构里面含有ino_t格式的d_ino和char格式的d_name[]
    13     struct stat statbuf;            //声明stat格式的statbuf
    14     
    15     if((dp = opendir(dir))==NULL)//,打开目录,建立目录流,判断打开的目录不是空
    16     {
    17         fprintf(stderr,"cannot open directory:%s\n",dir);//要是空的话给标准错错误写提示
    18         return;
    19     }
    20     chdir(dir);                    //改变到传入的目录中去
    21     while((entry=readdir(dp))!=NULL)//读取目录流dp,获得一个指针,成功的话进入循环
    22     {
    23         lstat(entry->d_name,&statbuf);//获取指定路径(dirent结构指针)的描述到stat结构statbuf中
    24         if(S_ISDIR(statbuf.st_mode))//判断这个路径文件是不是目录,
    25         {                        //是目录的话进入循环
    26             if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
    27             continue;//如果是.或者..目录的话,继续执行
    28             printf("%*s%s/\n",depth," ",entry->d_name);//首先按照depth缩进,打印这个目录的文件名
    29             printdir(entry->d_name, depth+4);//递归调用这个函数本身,也就是进入这个目录中,缩进增加四个空格
    30         }                                            //(2层)在这个函数里面只有文件,就不进入这个循环
    31         else
    32         printf("%*s%s\n",depth," ",entry->d_name);//不是目录的话,打印按照depth的缩进打印出文件名
    33     }
    34     chdir("..");//第一次循环失败的话返回上级目录(2层)打印完成之后跳出这个目录,继续上层没完成的打印
    35     closedir(dp);//关闭打开的流                (2层)关闭流,防止超过
    36 }
    37 int main (int argc, char * argv[])//    主函数
    38 {
    39     char * topdir=".";        //定义char *类型的topdir指向当前目录也就是.
    40     if (argc>=2)                //要是输入的参数不是空
    41         topdir=argv[1];        //就把要打印的路径赋值给topdir
    42                   //argv[0]代表程序本身,要是输入的参数是空,也就是默认的打印的目录就是topdir="."
    43     printf("Directory scan of %s\n",topdir);//打印一句话
    44     printdir(topdir,0);//调用函数,实现循环打印
    45     printf("done.\n");
    46     
    47     exit(0);
    48 }

    运行效果:

     1 jason@t61:~/桌面$ ls
     2 a.out  apue.h  apue.h~  printdir.c  printdir.c~  无标题文档  无标题文档~
     3 jason@t61:~/桌面$ gcc printdir.c
     4 jason@t61:~/桌面$ ./a.out 
     5 Directory scan of .
     6  printdir.c~
     7  无标题文档
     8  apue.h~
     9  a.out
    10  printdir.c
    11  apue.h
    12  无标题文档~
    13 done.

    参考文献:

    Linux程序设计 Neil Matthew

    UNIX环境高级编程 W. Richard Stevens

    http://www.cnblogs.com/avril/archive/2010/03/22/1691477.html

  • 相关阅读:
    课程作业(一)
    PTA 5-3 解题报告
    作业(四)
    C#循环语句整理
    C#数组和集合整理
    作业(三)
    1.0总结
    如何在C++中产生随机数
    CLSRSC-400: A system reboot is required to continue installing.
    Upgrade a Non-CDB To a PDB on CDB
  • 原文地址:https://www.cnblogs.com/kongchung/p/4601566.html
Copyright © 2020-2023  润新知