zoukankan      html  css  js  c++  java
  • 一个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

  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/kongchung/p/4601566.html
Copyright © 2011-2022 走看看