利用文件属性相关函数和操作目录函数实现ls -l功能

该代码实现了一个Linux命令行工具,用于遍历指定目录并打印出文件的详细信息,包括类型、权限模式、所有者、组、大小和修改时间。它使用了如`opendir`、`readdir`、`stat`等系统调用,并通过`get_filetype`、`get_mode`、`get_usrname`和`get_grpname`函数获取和解析文件属性。
摘要由CSDN通过智能技术生成

main.c文件

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

int main(int argc,const char *argv[])
{
        DIR *dp=opendir(argv[1]);
        if(NULL==dp)
        {
                perror("opendir");
                return -1;
        }
        struct dirent *rp=NULL;
        while(1)
        {
                rp=readdir(dp);
                if(NULL==rp)
                {
                        if(0==errno)
                        {
                                printf("dir reading success!\n");
                                break;
                        }
                        else
                        {
                                perror("readdir");
                                return -1;
                        }
                }
                if(*rp->d_name=='.')
                {
                        continue;
                }
                struct stat buf;
                char a[50];            //创建一个字符串数组
                bzero(a,sizeof(a));
                strcpy(a,argv[1]);     //将argv[1]的路径复制字符串数组a
                int i=strlen(a);         //i去字符串数组的长度
                strcat(a,rp->d_name); 
                if(a[i-1]!='/')                //判断最后一位是不是‘/’,是就跳过,不是就在后
                {                              //面添加‘/’,例如你的argv[1]是../,就不需要
                        a[i]='/';              //添加/,如果是../day2,寻找day2中的文件就   
                }                               //需要添加‘/’
                strcat(a,rp->d_name);      //将argv[1]和目录中文件名字结合形成文件的绝对路径                           
                if(stat(a,&buf)<0)
                {
                        perror("stat");
                        return -1;
                }
                get_filetype(buf.st_mode);
                get_mode(buf);
                printf(" %ld\t",buf.st_nlink);
                get_usrname(buf.st_uid);
                get_grpname(buf.st_gid);
                printf(" %ld\t",buf.st_size);
                get_time(buf.st_mtime);
                printf("%s\n",rp->d_name);
        }
        closedir(dp);
        return 0;
}

.c文件

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include"a.h"

int get_mode(struct stat buf)
{
        int i=0;
        while(i<9)
        {
                if((buf.st_mode & 1<<(8-i))!=0)
                {
                        if((i+1)%3==1)
                        {
                                printf("r");
                        }
                        else if((i+1)%3==2)
                        {
                                printf("w");
                        }
                        else
                        {
                                printf("x");
                        }
                }
                else
                {
                        printf("-");
                }
                i++;
        }
        return 0;
}
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("unknow!\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\t",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\t",grp->gr_name);
        return 0;
}

int get_time(time_t mtime)
{
        struct tm* info=NULL;
        info=localtime(&mtime);
        printf("%d-%02d-%02d %02d:%02d:%02d\t",\
        info->tm_year+1900,info->tm_mon+1,info->tm_mday,\
        info->tm_hour,info->tm_min,info->tm_sec);
}

抓函数测试结果

当前文件下

 跨路径文件下

 

 

.h文件

#ifndef __A__
#define __A__

int get_mode(struct stat buf);

int get_filetype(mode_t m);

int get_usrname(uid_t uid);

int get_grpname(gid_t gid);

int get_time(time_t mtime);


#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值