• daima


    include <stdio.h>

    include <sys/types.h>

    include <dirent.h>

    include <sys/stat.h>

    include <string.h>

    void do_ls(char[]);
    void dostat(char *);
    void show_file_info( char *, struct stat *);
    void mode_to_letters( int , char[] );
    char * uid_to_name( uid_t );
    char * gid_to_name( gid_t );

    main(int ac, char av[])
    {
    if( ac == 1 )
    do_ls( "." ); /
    显示当前目录/
    else
    while( --ac ){
    printf("%s: ", ++av); /显示参数指定的目录
    /
    do_ls( *av );
    }
    }

    void do_ls( char dirname[] )
    {
    DIR *dir_ptr;
    struct dirent *direntp;

    if( (dir_ptr = opendir( dirname )) == NULL)            /*打开目录,成功则返回 DIR 结构指针*/
    fprintf(stderr, "ls1: cannot open %s
    ", dirname);
     
    else
    {
    while( ( direntp = readdir( dir_ptr ) ) != NULL )
         dostat( direntp->d_name );
    
    closedir( dir_ptr );
    }
    

    }

    void dostat( char *filename )
    {
    struct stat info;

    if( stat( filename, &info ) == -1 )
    perror( filename );
    else
    show_file_info( filename, &info );
    

    }

    void show_file_info( char *filename, struct stat *info_p )
    {

    char *uid_to_name(), *ctime(), *gid_to_name(), *filemode();
    void mode_to_letters();
    
    char modestr[11];
    
    mode_to_letters( info_p->st_mode, modestr );      /*模式到字符的转换*/
    
    printf("%s", modestr );                           /*输出模式标识符*/
    
    printf("%4d", (int)info_p->st_nlink);
    
    printf(" %-8s", uid_to_name(info_p->st_uid));
    
    printf("%-8s", gid_to_name(info_p->st_gid));
    
    printf("%8ld  ", (long)info_p->st_size);
    
    printf("%.12s ", 4 + ctime(&info_p->st_mtime));
    
    printf("%s
    ",filename);    
    

    }

    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_IXOTH)  str[7] = 'r';
    if(mode & S_IXOTH)  str[8] = 'w';
    if(mode & S_IXOTH)  str[9] = 'x';
    

    }

    include <pwd.h>

    char *uid_to_name( uid_t uid )
    

    /*
    *返回和 uid 相应的用户名的指针
    */
    {
    struct passwd *getpwuid(), *pw_ptr;
    static char numstr[10];

    if( ( pw_ptr = getpwuid( uid ) ) == NULL ) {
        sprintf(numstr, "%d", uid);      /*没有对应的用户名则 uid 存入 numstr,返回后以字符串的形式打印 uid*/
        return numstr;
    }
    else
        return pw_ptr->pw_name;          /*打印用户名*/
    }
    

    include <grp.h>

    char *gid_to_name( gid_t gid )
    {
    struct group *getgrgid(), *grp_ptr;
    static char numstr[10];
    
    if( ( grp_ptr = getgrgid(gid) ) == NULL ){
    
        sprintf(numstr, "%d", gid);
        return numstr;
    }
    else
        return grp_ptr->gr_name;
    }
  • 相关阅读:
    MyBatis的缓存
    16年随笔
    linux 随笔
    Linux下启动Tomcat启动并显示控制台日志信息
    linux 连接工具
    Linux Tomcat重新启动
    SpringMVC 文件上传 MultipartFile
    spring @component
    mysql转型
    MyBatis传入参数
  • 原文地址:https://www.cnblogs.com/1252854089qq/p/9927676.html
Copyright © 2020-2023  润新知