ls命令是Linux下最常用的命令之一,ls跟dos下的dir命令是一样的都是用来列出目录下的文件,下面我们就来一起看看ls的实现方法。
#include <dirent.h>
是POSIX.1标准定义的unix类目录操作的头文件,包含了许多UNIX系统服务的函数原型,例如opendir函数、readdir函数.
opendir函数:
DIR *opendir(const char *pathname);返回值:若成功则返回指针,若出错则返回NULL。
struct dirent *readdir(DIR *dp); 返回值:若成功则返回指针,若在目录结尾或出错则返回NULL。
ls的简要实现:
写makefile
运行测试:
--------------------------------------分割线 --------------------------------------
见下面程序:
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
int main( int argc, int *argv[] )
{
DIR *dir;
struct dirent *dirp;
if ( argc != 2 )
{
printf( "usage: %s directory_name \n", argv[0] );
return -1;
}
if ( !(dir=opendir(argv[1])) )
{
printf( "can not open %s\n", argv[1] );
return -1;
}
while ( (dirp=readdir(dir)) != NULL )
{
printf( "%s\n", dirp->d_name );
}
closedir( dir );
return 0;
}
对其中的几个重要结构体和函数解说一下。
opendir
opendir()用来打开参数 name 指定的目录,并返回 DIR* 形态的
目录流,和 open()类似,接下来对目录的读取和搜索都要使用此返回值,
成功则返回 DIR* 型态的目录流,打开失败则返回 NULL
readdir()返回参数 dir 目录流的下个目录进入点。 结构 dirent 定义
如下:
struct dirent
{
long d_ino; /* inode number */索引节点号
off_t d_off; /* offset to this dirent */在目录文件中的偏移
unsigned short d_reclen; /* length of this d_name */文件名长
unsigned char d_type; /* the type of d_name */文件类型
char d_name [NAME_MAX+1]; /* file name (null-terminated) */文件名,最长255字符
}
成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回 NULL。