输出目录内详细信息

该程序实现了Linux文件系统的部分功能,包括获取文件权限、类型、所有者、用户组、大小和创建时间。通过读取指定路径的目录,显示每个文件或目录的详细信息,如'rwx'权限、'd'表示目录、用户和组名称以及时间戳。
摘要由CSDN通过智能技术生成

                                                                                                                                                                                                                                                                                                                                                                                                           

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>


int get_permission(mode_t m, char* per)
{
    int i=0, j = 0;
    for(i=8; i>=0; i--)
    {
        if( (m & (1<<i)) == 0)
        {
            //    printf("-");
            per[j++] = '-';
            continue;
        }

        //能运行到当前位置则说明相应位置不为0
        switch(i%3)
        {
        case 2:
            //    printf("r");
            per[j++] = 'r';
            break;
        case 1:
            //    printf("w");
            per[j++] = 'w';
            break;
        case 0:
            //    printf("x");
            per[j++] = 'x';
            break;
        }
    }
    per[j] = 0;

    return 0;
}

#if 0
int get_fileType(mode_t m)
{
    if(S_ISREG(m))
        putchar('-');

    else if(S_ISDIR(m))
        putchar('d');

    else if(S_ISCHR(m))
        putchar('c');


    return 0;
}
#endif

int get_fileType(mode_t m)
{
    switch (m & S_IFMT) {
    case S_IFBLK:  printf("b");        break;
    case S_IFCHR:  printf("c");        break;
    case S_IFDIR:  printf("d");        break;
    case S_IFIFO:  printf("p");        break;
    case S_IFLNK:  printf("l");        break;
    case S_IFREG:  printf("-");        break;
    case S_IFSOCK: printf("s");        break;
    default:       printf("unknown?\n");   break;
    }
    return 0;
}

int get_usrname(uid_t uid)
{
    struct passwd* pwd = getpwuid(uid);
    if(NULL == pwd)
    {
        printf("getpwuid failed\n");
        return -1;
    }
    printf("%s ", pwd->pw_name);

    return 0;
}

int get_grpname(gid_t gid)
{
    struct group* grp = getgrgid(gid);
    if(NULL == grp)
    {
        printf("getgrgid failed\n");
        return -1;
    }
    printf("%s ", grp->gr_name);

    return 0;
}


int get_time(time_t ctime)
{
    struct tm *info = localtime(&ctime);

    //\r转义字符,将光标重新移动回开头
    printf("%d-%02d-%02d %02d:%02d:%02d ", \
            info->tm_year+1900, info->tm_mon+1, info->tm_mday,\
            info->tm_hour, info->tm_min, info->tm_sec);

    //由于printf是行缓冲,上述没有满足任何一种刷新缓冲区的机制
    //所以要用fflush强制刷新
    fflush(stdout);

    return 0;
}

int main(int argc, const char *argv[])
{
    if(argc < 2)
    {
        fprintf(stderr, "请输入路径\n");
        return -1;
    }

    DIR* dp =opendir(argv[1]);
    if(NULL == dp)
    {
        perror("opendir");
        return -1;
    }

    struct dirent* rp = NULL;
    struct stat buf;
    char per[10] = "";
    char str[300] = "";
    while(1)
    {
        rp = readdir(dp);
        if(NULL == rp)
        {
            if(0 == errno)     //没有更新错误码,目录被读取到结尾
            {
                printf("目录读取完毕\n");
                break;
            }
            else
            {
                perror("readdir");
                return -1;
            }
        }

        //判断是否是隐藏文件,如果是则不打印
        //隐藏文件:以字符.开头的文件
        if(rp->d_name[0] == '.')     //*(rp->d_name) == '.'
            continue;


        sprintf(str,"%s%s", argv[1], rp->d_name);
    //    printf("str = %s\n", str);

    //    continue;

        //获取文件属性
        if(stat(str, &buf) < 0)
        {
            perror("stat");
            return -1;
        }

        //文件类型以及权限
        //printf("mode: %o\n", buf.st_mode);
        get_fileType(buf.st_mode);
        get_permission(buf.st_mode, per);
        printf("%s ", per);

        //硬链接数
        printf(" %ld ", buf.st_nlink);

        //文件所属用户
        //printf("uid: %d\n", buf.st_uid);
        get_usrname(buf.st_uid);

        //文件所属组用户
        //printf("gid: %d\n", buf.st_gid);
        get_grpname(buf.st_gid);

        //文件大小
        printf("%5ld ", buf.st_size);

        //文件创建日期 
        //    printf("ctime:%ld\n", buf.st_mtime);
        get_time(buf.st_mtime);

        //文件名
        printf("%s\n", rp->d_name);


    }

    closedir(dp);
    return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值