实验 6仿写 Linux 下的 ls-l 命令,需要显示的文件属性包括:文件类型、权限、硬链接数、所有者用户名、 所有者所在组用户名、文件大小和最后修改时间。,要求用c语言
时间: 2024-01-26 12:02:36 浏览: 72
操作系统实验 C语言实现仿写简易文件系统 北XX大 NXXT(csdn)————程序.pdf
以下是一个简单的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
exit(EXIT_FAILURE);
}
DIR *dir;
struct dirent *entry;
struct stat sb;
char buf[512];
if ((dir = opendir(argv[1])) == NULL) {
perror("opendir");
exit(EXIT_FAILURE);
}
while ((entry = readdir(dir)) != NULL) {
sprintf(buf, "%s/%s", argv[1], entry->d_name);
if (stat(buf, &sb) == -1) {
perror("stat");
continue;
}
printf("%c%c%c%c%c%c%c%c%c%c %ld ",
S_ISDIR(sb.st_mode) ? 'd' : '-',
sb.st_mode & S_IRUSR ? 'r' : '-',
sb.st_mode & S_IWUSR ? 'w' : '-',
sb.st_mode & S_IXUSR ? 'x' : '-',
sb.st_mode & S_IRGRP ? 'r' : '-',
sb.st_mode & S_IWGRP ? 'w' : '-',
sb.st_mode & S_IXGRP ? 'x' : '-',
sb.st_mode & S_IROTH ? 'r' : '-',
sb.st_mode & S_IWOTH ? 'w' : '-',
sb.st_mode & S_IXOTH ? 'x' : '-',
sb.st_nlink);
struct passwd *pw = getpwuid(sb.st_uid);
if (pw != NULL) {
printf("%s ", pw->pw_name);
} else {
printf("%d ", sb.st_uid);
}
struct group *gr = getgrgid(sb.st_gid);
if (gr != NULL) {
printf("%s ", gr->gr_name);
} else {
printf("%d ", sb.st_gid);
}
printf("%ld ", sb.st_size);
struct tm *tm = localtime(&sb.st_mtime);
char time_buf[32];
strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", tm);
printf("%s ", time_buf);
printf("%s\n", entry->d_name);
}
closedir(dir);
exit(EXIT_SUCCESS);
}
```
该程序使用 `opendir()` 和 `readdir()` 函数打开并读取指定目录中的所有文件和子目录,然后对每个文件(夹)使用 `stat()` 函数获取其属性信息并打印出来。对于文件类型,程序根据 `st_mode` 字段中的 `S_ISDIR()` 宏来判断是否为目录。对于权限,程序使用 `st_mode` 字段中的各个标志位来判断是否具有读、写和执行权限。对于所有者用户名和所在组用户名,程序使用 `getpwuid()` 和 `getgrgid()` 函数分别获取其对应的 `passwd` 和 `group` 结构体,并从中获取用户名。对于文件大小,程序使用 `st_size` 字段。对于最后修改时间,程序使用 `st_mtime` 字段,并使用 `localtime()` 和 `strftime()` 函数将其格式化为字符串。最后,程序打印出文件(夹)名。
阅读全文