使用Linux C编程实现简单的ls命令

嵌入式技术

1368人已加入

描述

使用Linux C编程实现简单的ls命令具体代码如下:

加载的头文件有stdio.h,sys/types.h,dirent.h,unistd.h,sys/stat.h,fcntl.h,string.h等。

void main(int argc,char **argv){  
    DIR *dir;  
    struct dirent *rdir;  
    struct stat statbuf;  
    char * buffer=”/”;  
    char *file_; char *p;  
    int lenght=strlen(argv[argc-1]); 
    int len=argc;  
    char parameter[]={‘i’,’t’,’a’,’u’,’g’,’b’,’s’}; //参数属组  
    if(argc==1 ||strstr(argv[argc-1],buffer)==NULL){  
        argv[argc++]=”./”;  
        dir=opendir(“./”); //打开目录文件  
    }else{  
        dir=opendir(argv[argc-1]); 
        file_=argv[argc-1]; //打开目录文件  
    }  
    while((rdir=readdir(dir))!=NULL){ //读取目录中的目录或者文件  
        if(len!=argc){  
            file_=rdir->d_name; //从struct dirent结构取出文件名称  
        }else{  
            p=rindex(file_,’/’);  
            if(strlen(p)!=1){  
                strcat(file_,buffer);  
            }  
            strcat(file_,rdir->d_name);  
        }  
        int file=open(file_,O_RDONLY,0); //打开文件  
        stat(file_,&statbuf); //通过stat函数读取文件的状态信息放在struct stat 这个结构体中,这个结构包含文件的属组,属主,权限,时间戳,文件大小等。 
      int tmp=1; 
      while(tmp        if(rindex(argv[tmp],parameter[0])!=NULL){ 
            printf("%10d",rdir->d_ino); 
        } 
        if(rindex(argv[tmp],parameter[1])!=NULL){ 
              printf("%10d",statbuf.st_atime); 
        } 
        if(rindex(argv[tmp],parameter[2])!=NULL){ 
            printf("%10d",rdir->d_ino); 
              printf("%20d",statbuf.st_atime); 
            printf("%10d",statbuf.st_uid); 
            printf("%10d",statbuf.st_gid); 
            printf("%10d",statbuf.st_blocks); 
            printf("%10d",statbuf.st_size); 
        } 
        if(rindex(argv[tmp],parameter[3])!=NULL){ 
            printf("%10d",statbuf.st_uid); 
        } 
        if(rindex(argv[tmp],parameter[4])!=NULL){ 
            printf("%10d",statbuf.st_gid); 
        } 
        if(rindex(argv[tmp],parameter[5])!=NULL){ 
            printf("%10d",statbuf.st_blocks); 
        } 
        if(rindex(argv[tmp],parameter[6])!=NULL){ 
            printf("%10d",statbuf.st_size); 
        } 
        tmp++; 
    } 
    close(file);      //关闭打开的文件 
    if(len!=argc){ 
        int j=strlen(file_); 
        while(j>=lenght){ 
            file_[j--]=NULL; 
        } 
    } 
    printf("%20s\n",rdir->d_name); 
    } 
    closedir(dir);    //关闭打开的目录 
}

/*

struct stat {  
mode_t st_mode; //文件对应的模式,文件,目录等  
ino_t st_ino; //inode节点号  
dev_t st_dev; //设备号码  
dev_t st_rdev; //特殊设备号码  
nlink_t st_nlink; //文件的连接数  
uid_t st_uid; //文件所有者  
gid_t st_gid; //文件所有者对应的组  
off_t st_size; //普通文件,对应的文件字节数  
time_t st_atime; //文件最后被访问的时间  
time_t st_mtime; //文件内容最后被修改的时间  
time_t st_ctime; //文件状态改变时间  
blksize_t st_blksize; //文件内容对应的块大小  
blkcnt_t st_blocks; //伟建内容对应的块数量  
};

struct drient { 
  long d_ino;  索引节点号  
  off_t d_off;  在目录文件中的偏移  
  unsigned short d_reclen; 文件名长  
  unsigned char d_type; 文件类型  
  char d_name [NAME_MAX+1];  文件名,最长255字符  

  
int stat(const char *path, struct stat *struct_stat); 
  
int lstat(const char *path,struct stat *struct_stat); 
还有一个fstat函数。

两个函数的第一个参数都是文件的路径,第二个参数是struct stat的指针。返回值为0,表示成功执行。 
*/



 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分