ls用于列举目录内容,要实现这个功能,毫无疑问,需要读取目录,涉及到两个api:
opendir:DIR *opendir(const char *name), 传文件名,返回一个指针,指向目录序列
readdir:struct dirent *readdir(DIR *dirp), 把opendir的返回值传过来, 返回值为一个结构体
struct dirent { ino_t d_ino; /* inode number */ off_t d_off; /* not an offset; see NOTES */ unsigned short d_reclen; /* length of this record */ unsigned char d_type; /* type of file; not supported by all filesystem types */ char d_name[256]; /* filename */ };
有了这两个api,就可以实现一个简易的ls功能
1 /*================================================================ 2 * Copyright (C) 2018 . All rights reserved. 3 * 4 * 文件名称:myls.c 5 * 创 建 者:ghostwu(吴华) 6 * 创建日期:2018年01月09日 7 * 描 述: ls命令 8 * 9 ================================================================*/ 10 11 #include <stdio.h> 12 #include <sys/types.h> 13 #include <dirent.h> 14 #include <stdlib.h> 15 16 void do_ls( char [] ); 17 18 int main(int argc, char *argv[]) 19 { 20 if( argc == 1 ) { 21 do_ls( "." ); 22 }else { 23 while( --argc ) { 24 printf( "arg=%s\n", * ++argv ); 25 do_ls( *argv ); 26 } 27 } 28 return 0; 29 } 30 31 void do_ls( char dir_entry[] ) { 32 DIR* pDir; 33 struct dirent* pCurDir; 34 if( ( pDir = opendir( dir_entry ) ) == NULL ){ 35 perror( "read dir" ); 36 exit( -1 ); 37 }else { 38 while( ( pCurDir = readdir( pDir ) ) != NULL ) { 39 printf( "%s\n", pCurDir->d_name ); 40 } 41 } 42 }