一个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 [email protected]:~/桌面$ ls
 2 a.out  apue.h  apue.h~  printdir.c  printdir.c~  无标题文档  无标题文档~
 3 [email protected]:~/桌面$ gcc printdir.c
 4 [email protected]:~/桌面$ ./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

时间: 2024-12-17 19:10:22

一个linux目录扫描程序的相关文章

Linux下的目录扫描操作函数使用实践

[文章摘要] 本文以实际的C源程序为例子,介绍了Linux下的目录扫描函数(scandir)的使用方法,为相关开发工作的开展提供了有益的参考. [关键词] C语言  Linux  目录扫描  makefile  scandir 一.scandir命令简介 scandir函数的声明为: int scandir(const char *dir, structdirent ***namelist, int (*filter) (const void *b), int ( * compare )( co

Runtime.getRuntime.exec()执行linux脚本导致程序卡死有关问题

Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题问题: 在Java程序中,通过Runtime.getRuntime().exec()执行一个Linux脚本导致程序被挂住,而在终端上直接执行这个脚本则没有任何问题.原因: 先来看Java代码: public final static void process1(String[] cmdarray) {        Process p = null;        BufferedReader br = null

每天一个linux命令(23):Linux 目录结构

对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux目录结构的相关知识. 当在使用Linux的时候,如果您通过ls –l / 就会发现,在/下包涵很多的目录,比如etc.usr.var.bin ... ... 等目录,而在这些目录中,我们进去看看,发现也有很多的目录或文件.文件系统在Linux下看上去就象树形结构,所以我们

每天一个Linux命令(23)--linux 目录结构(一)

对于每一个Linux 学习者来说,了解 Linux 文件系统的目录结构,是学好Linux 的至关重要的一步,深入了解Linux 文件目录结构的标准和每个目录的详细功能,对于我们用好Linux 系统至关重要,下面我们就开始了解一下 Linux 目录结构的相关知识. 当在使用Linux 的时候,如果您通过 ls   -l   / 就会发现,在 /  下包涵很多的目录,比如 etc  usr  var   bin  等目录,而在这些目录中,我们进去看看,发现也有很多的目录或文件.文件系统在 Linux

Linux环境下部署完JDK后运行一个简单的Java程序

前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version"命令是否有正确的内容打印,也许这并不具备太大的说服力.可能能够运行起一个正确的java程序来,不管从感性角度还是理性角度来说,都会有一个更好的认识. 所以本文写一段很简单的java代码,并且在Linux环境下编译运行,以证明JDK部署得确实没有问题. 代码验证JDK部署是否正确 1.级联建立两个目录 首

每天一个Linux命令(23)--linux 目录结构(二)

二./usr 的意义与内容 依据FHS的基本定义, /usr 里面放置的数据属于可分享的与不可变动的(shareable,static), 如果你知道如何透过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr 确实可以分享给局域网络内的其它主机来使用. /usr 不是user的缩写,其实 usr 是Unix software resource 的缩写,也就是Unix 操作系统软件资源所放置的目录,而不是用户的数据啦.这点要注意,FHS建议所有软件开发者,应该讲他们的数据合理的

每天一个linux命令(19):Linux 目录结构

对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux目录结构的相关知识. 当 在使用Linux的时候,如果您通过ls –l / 就会发现,在/下包涵很多的目录,比如etc.usr.var.bin ... ... 等目录,而 在这些目录中,我们进去看看,发现也有很多的目录或文件.文件系统在Linux下看上去就象树形结构,所以

每天一个linux命令:Linux 目录结构

对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统至关只要,下面我们就开始了解一下linux目录结构的相关知识. 当在使用Linux的时候,如果您通过ls –l / 就会发现,在/下包涵很多的目录,比如etc.usr.var.bin ... ... 等目录,而在这些目录中,我们进去看看,发现也有很多的目录或文件.文件系统在Linux下看上去就象树形结构,所以我们

第六章 第一个linux个程序:统计单词个数

从本章就开始实战,实例是统计一片文章或者一段文字中的单词个数.还介绍了用不同的方法去测试linux驱动,这些方法主要使用平台来区分. 一.linux:linux跟普通的linux API没什么区别,只是使用方式不同而已.Linux系统每一个驱动都映射成一个文件,这些被映射的文件被称为设备文件或映射文件,并且都保存在./dev目录下. Linux驱动的工作方式:Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统.在Linux环境下设计驱动程序