mystat

完成 STAT(1)

使用stat.

man -k grep -r的使用

stat系统调用

c语言stat系统调用

使用stat系统调用,会返回一个结构体,其中包含了我们需要输出的信息。根据文件路径获取到这个结构体,再进行格式化输出。

//使用命令行传入文件路径参数argv
main{
  struct stat st;//首先定义stat结构体
  stat(argv,st);//根据文件路径,将文件信息写入结构体

  printf(st.xx);//根据stat的输出,将相应的信息进行输出就可以啦
  //(格式化输出时,对于文件的类型,需要单独进行判定,可以使用switch语句实现)
}
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int rwxMode[] = {0,S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH};

char getFileType(mode_t mode){
  if(S_ISDIR(mode)) return 'd';
  else if(S_ISCHR(mode))  return 'c';
  else if(S_ISBLK(mode)) return 'b';
  else if(S_ISFIFO(mode)) return 'f';
  else if(S_ISLNK(mode)) return 'l';
  else if(S_ISSOCK(mode)) return 's';
  else return '-';
}

int main(int argc, char *argv[])
{
    struct stat st;
    if (argc != 2)
    {
        fprintf(stderr, "使用“stat <filename or dirname>”。\n");
        exit(EXIT_FAILURE);
    }
    if (stat(argv[1], &st) == -1)
    {
        perror("stat");
        exit(EXIT_FAILURE);
    }
    printf("  文件: %s\n", argv[1]);
    printf("  大小:%ld\t\t",(long)st.st_size);
    printf("  块: %lld\t\t", (long long)st.st_blocks);
    printf("IO 块: %ld  ", (long)st.st_blksize);
    switch (st.st_mode & S_IFMT)
    {
    case S_IFBLK:
        printf("块设备\n");
        break;
    case S_IFCHR:
        printf("character device\n");
        break;
    case S_IFDIR:
        printf("目录\n");
        break;
    case S_IFIFO:
        printf("FIFO/管道\n");
        break;
    case S_IFLNK:
        printf("符号链接\n");
        break;
    case S_IFREG:
        printf("普通文件\n");
        break;
    case S_IFSOCK:
        printf("socket\n");
        break;
    default:
        printf("未知?\n");
        break;
    }
    printf("设备: %lxh/%lud\t",st.st_dev,st.st_dev);
    printf("Inode: %ld\t\t", (long)st.st_ino);
    printf("硬连接: %ld\n", (long)st.st_nlink);
    char fileMode[11];
    strcpy(fileMode, "-rwxrwxrwx");
    fileMode[0] = getFileType(st.st_mode);
    for(int j = 1; j < 10; ++j)
      if(!(st.st_mode & rwxMode[j])) fileMode[j] = '-';
    printf("权限: (%s)",fileMode);
    printf("\tidD=( %ld/   lzh)   Gid=( %ld/   lzh)\n", (long)st.st_uid, (long)st.st_gid);
    printf("最近访问: %s", ctime(&st.st_atime));
    printf("最近更改: %s", ctime(&st.st_mtime));
    printf("最近改动: %s", ctime(&st.st_ctime));
    printf("创建时间: -\n");
    exit(EXIT_SUCCESS);
}

posted on 2022-10-12 20:15  20201310寸头  阅读(24)  评论(0编辑  收藏  举报