2022-10-10

//fun.h
#ifndef __FUN_H__
#define __FUN_H__

int get_mode(mode_t mode);
int get_usrName(uid_t uid);
int get_usrGroup(gid_t gid);
int get_size(char *pathname);
int get_lastTime(time_t time);

#endif
// fun.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include"fun.h"
int get_mode(mode_t mode)
{
    char str[11] = "-";
    int flag = 0;
    for(int i = 0;i <= 8;i++)
    {
        flag++;
        if( mode & (0400 >> i) )
        {
            switch(flag%3)
            {
                case 1: str[flag] = 'r';break;
                case 2: str[flag] = 'w';break;
                case 0: str[flag] = 'x';break; 
                default: printf("mode erro\n");
                    return -1;
            }
        }
        else
        {
            str[flag] = '-';
        }
    }
    str[++flag] = '\0';
    printf("%s",str);
    return 0;
}

int get_usrName(uid_t uid)
{
    struct passwd *usr = getpwuid(uid);
    if(NULL == usr)
    {
        perror("get_usrName");
        return -1;
    }
    printf("%s",usr->pw_name);
    return 0;
}

int get_usrGroup(gid_t gid)
{
    struct group *usr = getgrgid(gid);
    if(NULL == usr)
    {
        perror("get_usrGroup");
        return -1;
    }
    printf("%s",usr->gr_name);
    return 0;
}

int get_size(char *pathname)
{
    FILE *fp = fopen(pathname,"r");
    if(NULL == fp)
    {
        printf("fopen get_size erro");
        return -1;
    }
    fseek(fp,0,SEEK_END);
    printf("%ld",ftell(fp));
    if(EOF == fclose(fp))
    {
        perror("fclose get_size erro");
        return -1; 
    }
    return 0;
}

int get_lastTime(time_t time)
{
    struct tm *last = localtime(&time);
    if(NULL == last)
    {
        perror("get_lastTime");
        return -1;
    }
    printf("%02d月 %2d %02d:%02d"\
                ,last->tm_mon+1 \
                ,last->tm_mday \
                ,last->tm_hour \
                ,last->tm_min \
            );
    return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <dirent.h>
#include "fun.h"
int main(int argc,const char *argv[])
{
  struct stat buff;
  char path[50];
  DIR *dp = opendir(argv[1]);
  if(NULL == dp)
  {
    perror("opendir");
    return -1;
  }
  char *name = NULL;
  struct dirent * dirp = NULL;
  while(dirp = readdir(dp))
  {
    name = dirp->d_name;
    if('.' == *name)
    {
      continue;
    }
    bzero(path,sizeof(path));
    strcpy(path,argv[1]);
    strcat(path,"/");
    strcat(path,name);
    // puts(path);
    // puts(path);
    stat(path,&buff);
    get_mode(buff.st_mode);
    putchar(' ');
    printf("%ld",buff.st_nlink);
    putchar(' ');
    get_usrName(buff.st_uid);
    putchar(' ');
    get_usrGroup(buff.st_gid);
    putchar(' ');
    get_size(path);
    putchar(' ');
    get_lastTime(buff.st_ctime);
    putchar(' ');
    puts(name);
  }
  if(-1 == closedir(dp))
  {
    perror("closedir");
    return -1;
  }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值