linux下ls命令代码及注释

这是《Unix/Linux编程实践教程》上第三章的第一个例子,教给你怎样编写一个最基本的ls指令。我在原来的代码上添加了按照格式化输出,使输出整洁一点。显示效果如下:

代码附在文末,先谈一谈我的收获:

  1. 文件夹本身也是个文件,其内容是父目录、子目录的位置以及其所包含的文件。是文件就说明理论可以用open、close、read等系统函数操作。但因为文件夹的内容里包含了许多文件系统的内容,直接打开会显示无用内容,而不是我们想要的。
  2. 那应该如何访问目录呢?操作系统还未我们提供了一套专门用来访问目录的函数:opendir用于打开一个文件夹,readdir每调用一次可以显示文件夹中的一项内容(文件或子文件夹),closedir来关闭这个文件夹。是不是和文件操作很像?具体使用看代码就知道了~

代码如下:

[c]
//ls1.c

#include<stdio.h>

//unix类目录操作头文件
//包含了opendir函数、readdir函数等
#include<dirent.h>

//实现文件夹内容的查找、显示
void do_ls(char []);

main(int ac,char * av[])
{
//当指令没有跟随参数时
//默认为当前文件夹
//当前文件夹用“.”表示
if(ac == 1)
do_ls(".");
//有参数时,一个一个来
else
while(--ac){
printf("%s:n",* ++ av);
do_ls(*av);
}
}

void do_ls(char dirname[])
{
//同文件描述符一样
//建立文件夹描述符
//是DIR型,是个指针
DIR * dir_ptr;

//这个结构体包含元素:
//d_name文件名
//d_type
//其它的见手册
struct dirent *direntp;

//用于结构化输出
int i=0;

//是不是跟打开文件很像呢?
if((dir_ptr = opendir(dirname)) == NULL)
fprintf(stderr, "ls1:cannot open %sn",dirname);
else
{
//每条用一次readdir,都会返回此文件夹中一项的信息
//(文件或者文件夹),这也是个逐条遍历的过程
while(( direntp = readdir(dir_ptr)) != NULL){
printf("%-12s",direntp->d_name);
if(++i == 6)    {printf("n");i=0;}
}
printf("n");
//文件夹用完了也要关闭!
closedir(dir_ptr);
}
}
[/c]