实现Linux下的ls命令,网上的代码总是不是太完善。主要实现ls, ls -l两个功能。分栏排序不是很满意,linux原版分栏简直赞,对齐的十分完美。这个代码是在网上的基础上改bug和修改完成。
代码更新在
https://github.com/ljfly/ls
主要函数void do_ls( int,char [] );
void dostat( char * ); /*get file info*/
void show_file_info( char *,struct stat * ); //ls -l 的输出
void display_Ls( int cnt ) // ls 的分栏输出
void mode_to_letters( int,char [] ); //文件属性: drwxr-xr-x
char *uid_to_name( uid_t ); /* 通过 uid 获得对应的用户名 */
char *gid_to_name( gid_t ); /* 通过 gid 获得对应的组名 */
void getcolor( char * ); //获取压缩颜色
int get_file_type( char * ); /*get file type*/
int get_modify_time( char * ); /*get file last modify time*/
void getWidth(); //获取屏幕宽度
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/ioctl.h>
#include<dirent.h>
#include<pwd.h>
#include<grp.h>
#include<unistd.h>
/*head file*/
#define LenOfName 256
#define maxN 1005
#define maxM 505
#define maxL 105
#define LenOfPath 256<<4
#define LS 0 //ls
#define LS_A 1 //ls -a
#define LS_L 2 //ls -l
#define LS_TMP 3 //ls /tmp
#define LS_T 5 //ls -t
/*define file*/
void do_ls( int,char [] );
void dostat( char * ); /*get file info*/
void show_file_info( char *,struct stat * ); //ls -l 的输出
void mode_to_letters( int,char [] ); //文件属性:drwxr-xr-x
char *uid_to_name( uid_t ); /* 通过uid获得对应的用户名 */
char *gid_to_name( gid_t ); /* 通过gid获得对应的组名 */
void getcolor( char * );
int get_file_type( char * ); /*get file type*/
int get_modify_time( char * ); /*get file last modify time*/
void getWidth();
int cmp1( const void * ,const void * ); //文件名排序
int cmp2( const void * ,const void * ); //文件修改时间排序
struct outputFile{
char FileName[ LenOfName ];
int modify_time ;
int file_type ;
}Output[ maxN ],OutputPoint[ maxM ],Temp[ maxN+maxM ];
int colormode,foreground,background;
int terminalWidth ;
void dostat( char *filename ){
struct stat info;
if( stat( filename,&info )==-1 ){
perror( filename );
printf("filename:%s\n", filename);
}
else{
char *pname = strrchr(filename, '/');
getcolor(filename );
show_file_info( pname+1,&info );
}
return ;
}
/*get file info*/
void mode_to_letters( int mode,char str[] ){
strcpy( str,"----------" );
if( S_ISDIR( mode ) ) str[0] = 'd';
if( S_ISCHR( mode ) ) str[0] = 'c';
if( S_ISBLK( mode ) ) str[0] = 'b';
if( mode&S_IRUSR ) str[1] = 'r';
if( mode&S_IWUSR ) str[2] = 'w';
if( mode&S_IXUSR ) str[3] = 'x';
if( mode&S_IRGRP ) str[4] = 'r';
if( mode&S_IWGRP ) str[5] = 'w';
if( mode&S_IXGRP ) str[6] = 'x';
if( mode&S_IROTH ) str[7] = 'r';
if( mode&S_IWOTH ) str[8] = 'w';
if( mode&S_IXOTH ) str[9] = 'x';
return ;
}
char *uid_to_name( uid_t uid ){
struct passwd *pw_ptr;
static char numstr[ 10 ];
if( (pw_ptr = getpwuid( uid ) )==NULL ){
sprintf(numstr,"%d",uid);
return numstr;
}
else{
return pw_ptr->pw_name;
}
}
/* 通过uid获得对应的用户名 */
char *gid_to_name( gid_t gid ){
struct group *grp_ptr;
static char numstr[ 10 ];
if( (grp_ptr = getgrgid( gid ) )==NULL ){
sprintf(numstr,"%d",gid);
return numstr;
}
else{
return grp_ptr->gr_name;
}
}
/* 通过gid获得对应的组名 */