课上补做:用C语言编程实现ls命令

参考伪代码实现ls的功能,提交代码的编译,运行结果截图,码云代码链接。

打开目录文件
针对目录文件
读取目录条目
显示文件名
关闭文件目录文件
实验结果:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>
int do_ls(char *dir,char *filename,int lflag)
{
    int n;
    struct stat buf;
    char out[100];
    struct passwd *pw;
    struct group *gr;
    struct tm *t;
    if(lflag == 0)
    {
        printf("%s\t",filename);
        return 0;
    }
    if(lstat(dir,&buf)<0)
    {
        fprintf(stderr,"stat error:%s\n",strerror(errno));
        return -1;
    }
    switch(buf.st_mode & S_IFMT)
    {
    case S_IFREG:
        printf("-");
        break;
    case S_IFDIR:
        printf("d");
        break;
    case S_IFCHR:
        printf("c");
        break;
    case S_IFBLK:
        printf("b");
        break;
    case S_IFIFO:
        printf("p");
        break;
    case S_IFLNK:
        printf("l");
        break;
    case S_IFSOCK:
        printf("s");
        break;
    }
    for(n=8; n>=0; n--) 
    {
        if(buf.st_mode&(1<<n))
        {
            switch(n%3)
            {
            case 2:
                printf("r");
                break;
            case 1:
                printf("w");
                break;
            case 0:
                printf("x");
                break;
            default:
                break;
            }
        }
        else
        {
            printf("-");
        }
    }
    printf(" %d",buf.st_nlink); 
    pw = getpwuid(buf.st_uid); 
    printf(" %s",pw->pw_name);
    gr = getgrgid(buf.st_gid); 
    printf(" %s",gr->gr_name);
    printf(" %ld",buf.st_size); 
    t = localtime(&buf.st_atime); 
    printf(" %d-%d-%d %d:%d"
           ,t->tm_year+1900
           ,t->tm_mon+1
           ,t->tm_mday
           ,t->tm_hour
           ,t->tm_min);
    printf(" %s ",filename);
    if(S_ISLNK(buf.st_mode)) 
    {
        printf(" -> ");
        if(readlink(filename,out,100)==-1)
        {
             //printf("readlink error\n");
        }
        printf("%s",out);
    }
    printf("\n");
    return 0;
}
int ls_prepare(char *w,int aflag,int lflag)
{
    struct stat buf;
    char name[100];
    DIR *dir;
    struct dirent *pdr;
    if(lstat(w,&buf)<0)
    {
        fprintf(stderr,"stat error:%s\n",strerror(errno));
        return -1;
    }
    if(S_ISDIR(buf.st_mode))
    {
        dir = opendir(w); 
        while ((pdr = readdir(dir))!=NULL) 
        {
            if(aflag==0)
            {
                if(pdr->d_name[0]=='.')
                    continue;
                memset(name,0,100);
                strcpy(name,w); 
                strcat(name,"/");
                strcat(name,pdr->d_name);
                do_ls(name,pdr->d_name,lflag);
            }
            else  
            {
                memset(name,0,100);
                strcpy(name,w);
                strcat(name,"/");
                strcat(name,pdr->d_name);
                do_ls(name,pdr->d_name,lflag);
            }
        }
        closedir(dir);
    }
    else  
    {
        do_ls(w,w,lflag);
    }
    return 0;
}
int main(int argc,char **argv)
{
    int aflag =0;
    int lflag =0;
    char c;
    int i;
    while((c = getopt(argc,argv,"al"))!=-1) 
    {
        switch(c)
        {
        case 'a':
            aflag =1;
            break;
        case 'l':
            lflag =1;
            break;
        default:
            break;
        }
    }
    if(argc == optind ) 
    {
        ls_prepare("./",aflag,lflag);
    }
    else
    {
        for(i=optind; i<argc; i++) 
        ls_prepare(argv[i],aflag,lflag);
    }
    printf("\n");
    return 0;
}
posted @ 2018-11-11 20:10  20165305  阅读(304)  评论(0编辑  收藏  举报