demo1获取文件属性
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> // ./demo 1.txt int main(int argc, const char **argv) { if(argc != 2) { printf("Input Error!\n"); return -1; } struct stat s_buf; if(stat(argv[1], &s_buf)) { perror("stat failed"); return -2; } printf("st_dev: %lu\n", s_buf.st_dev); // 设备号 printf("st_ino: %lu\n", s_buf.st_ino); // 索引号 printf("st_mode: %u\n", s_buf.st_mode); // 文件权限-类型(需解析) printf("st_nlink: %lu\n", s_buf.st_nlink); // 硬链接数 printf("st_uid: %u\n", s_buf.st_uid); // 用户ID printf("st_gid: %u\n", s_buf.st_gid); // 组ID printf("st_rdev: %lu\n", s_buf.st_rdev); // 特殊设备号(普通文件无效,设备文件有效) printf("st_size: %ld\n", s_buf.st_size); // 文件大小 printf("st_blksize: %ld\n", s_buf.st_blksize); // IO操作页面字节数 printf("st_blocks: %ld\n", s_buf.st_blocks); // 占用存储块 // 文件的访问-修改-状态修改时间(需解析) printf("st_atim: %ld\n", s_buf.st_atim.tv_sec); printf("st_mtim: %ld\n", s_buf.st_mtim.tv_sec); printf("st_ctim: %ld\n", s_buf.st_ctim.tv_sec); return 0; }
demo2ls-lc查看文件详细信息.c
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> // ./my_ls 1.txt int main(int argc, const char **argv) { if(argc != 2) { printf("Input Error!\n"); return -1; } struct stat s_buf; if(stat(argv[1], &s_buf)) { perror("stat failed"); return -2; } // 1.文件类型(需对st_mode进行解析) switch(s_buf.st_mode&S_IFMT) { case S_IFSOCK: printf("s"); break; case S_IFLNK: printf("l"); break; case S_IFREG: printf("-"); break; case S_IFBLK: printf("b"); break; case S_IFDIR: printf("d"); break; case S_IFCHR: printf("c"); break; case S_IFIFO: printf("p"); break; } // 2.文件权限(文件所有者、同组用户、其他用户)(同1) // 文件所有者 // if((s_buf.st_mode&S_IRWXU)&S_IRUSR) // printf("r"); // else // printf("-"); // if((s_buf.st_mode&S_IRWXU)&S_IWUSR) // printf("w"); // else // printf("-"); // if((s_buf.st_mode&S_IRWXU)&S_IXUSR) // printf("x"); // else // printf("-"); //---------------------------------------------- char mod[10]; bzero(mod, 10); char rwx[3] = {'r', 'w', 'x'}; for(int i=0; i<9; i++) mod[i] = s_buf.st_mode&(0400>>i) ? rwx[i%3] : '-'; printf("文件权限:%s\n", mod); //....(完成后,思考一下是否有更简短一些的代码呢?) printf(" "); // 3.硬链接数 printf("%lu ", s_buf.st_nlink); // 4.所有者用户名(需对st_uid进行解析) printf("- "); // 使用 getpwuid() 函数实现 // 5.组名(需对st_gid进行解析) printf("- "); // 使用 getgrgid() 函数实现 // 6.文件大小 printf("%ld ", s_buf.st_size); // 7.修改时间 (需对st_mtim进行解析) printf("- "); // 使用 ctime() 函数实现 // 8.文件名 printf("%s\n", argv[1]); return 0; }