2022
我们一起努力

使用Linux C编程实现简单的ls命令(用linux编写c程序)

使用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<argc){
        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,表示成功执行。
*/

本文从互联网转载,来源地址:www.downzz.com/shell/18452.html,原作者保留一切权利,若侵权或引用不当,请联系茶猫云(cmy.cn)删除。【茶猫云,优质云服务器提供商】

赞(0)
文章名称:《使用Linux C编程实现简单的ls命令(用linux编写c程序)》
文章链接:https://www.fzvps.com/36044.html
本站文章来源于互联网,如有侵权,请联系管理删除,本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
图片版权归属各自创作者所有,图片水印出于防止被无耻之徒盗取劳动成果的目的。

评论 抢沙发

评论前必须登录!