ls基本功能的实现

来源:互联网 发布:mac skype 下载 编辑:程序博客网 时间:2024/05/22 00:47


要说我们的命令,那不可少的就是ls,那么ls就是列出当前目录下的文件。

这里有命令解释器的实现:http://blog.csdn.net/qq_35256722/article/details/53316066

包含pwd和clear命令:http://blog.csdn.net/qq_35256722/article/details/53322604

函数介绍:

  1.struct dirent *entry;
  2.struct stat statbuf[100];

  3.DIR *open(const char *name); 打开目录

          在我的代码中出现的:dp = opendir(dir))  打开dir这个目录 ,

  4. struct dirent *entry;  entry 里面有两个信息d_ino  和d_name

        在我的代码中出现的:entry = readdir(dp)    从该目录下,读出来详细的信息,存在entry这个结构体中,这个结构体含有文件名和结点信息。

  5. 在我的代码中出现的:lstat(entry->d_name,&statbuf[i]);  根据这个文件名字找到关于该文件的众多信息,

     struct stat {
               dev_t     st_dev;     /* ID of device containing file */
               ino_t     st_ino;     /* inode number */
               mode_t    st_mode;    /* protection */
               nlink_t   st_nlink;   /* number of hard links */
               uid_t     st_uid;     /* user ID of owner */
               gid_t     st_gid;     /* group ID of owner */
               dev_t     st_rdev;    /* device ID (if special file) */
               off_t     st_size;    /* total size, in bytes */
               blksize_t st_blksize; /* blocksize for file system I/O */
               blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
               time_t    st_atime;   /* time of last access */
               time_t    st_mtime;   /* time of last modification */
               time_t    st_ctime;   /* time of last status change */
           };

  6.  S_ISDIR(m)  查看是否为目录文件

      在我的代码中出现的:S_ISDIR(statbuf[j].st_mode)  ,查看是否为目录文件

  7.   用这些宏来&这些权限,&相同为1,不同为0,那么就是与组权限的可执行 &,只有相同那么才说明拥有该权限。u、o一样。

        在我的代码中出现的:if(statbuf[j].st_mode & S_IXUSR || statbuf[j].st_mode & S_IXGRP||       statbuf[j].st_mode & S_IXOTH  )   是否是可执行文件

  8. printf("\033[1;34m%s  \033[0m",name[j]);  打印颜色;

更多颜色信息在:http://blog.csdn.net/qq_35256722/article/details/53323068

  9.mode &S_IRUSR 是否有权限,  解释同7.

代码如下:

#include<stdio.h>#include<unistd.h>#include<dirent.h>#include<string.h>#include<stdlib.h>#include<sys/stat.h>#include<grp.h>#include<pwd.h>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';}void swap(struct stat *rs,char *sr1,char *sr2,int m){char tmp[100] = {0};strcpy(tmp,sr1);strcpy(sr1 , sr2);strcpy(sr2 , tmp);struct stat tmp1;tmp1 = rs[m];rs[m] = rs[m+1];rs[m+1] = tmp1;}void print_d(struct stat statbuf[],char name[100][100],int j){    if(S_ISDIR(statbuf[j].st_mode))    {         printf("\033[1;34m%s  \033[0m",name[j]);    }    else{if(statbuf[j].st_mode & S_IXUSR || statbuf[j].st_mode & S_IXGRP|| statbuf[j].st_mode & S_IXOTH  ){ printf("\033[1;32m%s  \033[0m",name[j]);}else{ printf("%s  ",name[j]);}}}void sort(struct stat st[],char name[100][100],int num){int i = 0;int j = 0;   for(j = 0; j < num-1; j ++){for(i = 0; i < num-1-j;i ++){   if(strcmp(name[i] ,name[i+1]) > 0)   {    swap(st,name[i],name[i+1],i);   }}}}void printdir(char *dir,char *argv){DIR *dp;struct dirent *entry;struct stat statbuf[100];char name[100][100]= {0};int i = 0;int count = 0;char modestr[11];if((dp = opendir(dir)) == NULL){printf("cannot open!!!\n");return ;}while((entry = readdir(dp)) !=NULL){lstat(entry->d_name,&statbuf[i]);strcpy(name[i],entry->d_name);i ++;count ++;}sort(statbuf,name,count);int k = 0;for(k = 0;k < i; k ++){if(argv == NULL){    if(strncmp(".",name[k],1) == 0)     continue;        print_d(statbuf,name,k);}else if(strcmp(argv,"-a") == 0){    //if(strncmp(".",name[k],1) == 0)    // continue;        print_d(statbuf,name,k);}else if(strcmp(argv,"-l") == 0){    if(strncmp(".",name[k],1) == 0)     continue;    mode_to_letters(statbuf[k].st_mode,modestr);printf("%s",modestr);printf("%4d",(int)statbuf[k].st_nlink);printf("%-8s",getpwuid(statbuf[k].st_uid)->pw_name);printf("%-8s",getgrgid(statbuf[k].st_gid)->gr_name);printf("%8ld",(long)statbuf[k].st_size);printf("%.12s",4+ctime(&statbuf[k].st_mtime));        print_d(statbuf,name,k);printf("\n");}else if(strcmp(argv,"-i") == 0){    if(strncmp(".",name[k],1) == 0)  continue;printf("%d ",statbuf[k].st_ino);        print_d(statbuf,name,k);}else{printf("error bg !\n");}}closedir(dp);}int main(int argc,char *argv[]){char *topdir = ".";printdir(topdir,argv[1]);printf("\n");return 0;}


0 0
原创粉丝点击