在 Ubuntu 中,copendir 函数用于打开一个目录流,以便逐个读取目录中的条目。要使用 copendir 获取文件属性,通常会结合其他函数如 readdir 和 stat 来实现。以下是一个示例代码,演示如何使用这些函数来列出指定目录中所有文件的名称和基本属性。
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
int main(int argc, char *argv[]) {
DIR *dir;
struct dirent *entry;
struct stat file_stat;
char path[1024];
// 检查命令行参数
if (argc != 2) {
fprintf(stderr, "用法: %s <目录路径>\n", argv[0]);
return EXIT_FAILURE;
}
// 打开目录
dir = opendir(argv[1]);
if (dir == NULL) {
perror("opendir 失败");
return EXIT_FAILURE;
}
// 遍历目录中的每个条目
while ((entry = readdir(dir)) != NULL) {
// 跳过当前目录和上级目录的特殊条目
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
// 构建文件的完整路径
snprintf(path, sizeof(path), "%s/%s", argv[1], entry->d_name);
// 获取文件的属性
if (stat(path, &file_stat) == -1) {
perror("stat 失败");
closedir(dir);
return EXIT_FAILURE;
}
// 输出文件信息
printf("文件名: %s\n", entry->d_name);
printf("大小: %ld 字节\n", file_stat.st_size);
printf("权限: ");
if (S_ISREG(file_stat.st_mode))
printf("常规文件");
else if (S_ISDIR(file_stat.st_mode))
printf("目录");
else if (S_ISCHR(file_stat.st_mode))
printf("字符设备");
else if (S_ISBLK(file_stat.st_mode))
printf("块设备");
else if (S_ISFIFO(file_stat.st_mode))
printf("命名管道");
else if (S_ISSOCK(file_stat.st_mode))
printf("套接字");
else
printf("其他类型");
printf("\n最后修改时间: %s", ctime(&file_stat.st_mtime));
printf("\n---------------------------\n");
}
// 关闭目录流
closedir(dir);
return EXIT_SUCCESS;
}
将上述代码保存为 list_files.c。
打开终端,导航到保存代码的目录。
使用以下命令编译代码:
gcc -o list_files list_files.c
运行程序,并指定要列出的目录路径。例如,列出当前目录的内容:
./list_files .
opendir: 打开一个目录流,返回一个 DIR * 指针。如果失败,返回 NULL 并设置 errno。
readdir: 读取目录流中的下一个条目,返回一个 struct dirent * 指针。当没有更多条目时,返回 NULL。
stat: 获取文件的状态信息,填充 struct stat 结构体。通过该结构体,可以获取文件的大小、权限、修改时间等信息。
closedir: 关闭打开的目录流,释放相关资源。
确保程序具有访问目标目录的权限,否则 opendir 和 stat 可能会失败。
处理符号链接时要小心,避免无限循环或访问错误的文件。
错误处理非常重要,尤其是在系统调用失败时,应使用 perror 或其他方法输出错误信息,以便调试。
通过上述示例,您可以在 Ubuntu 中使用 copendir 结合其他文件操作函数来获取目录中文件的属性。根据需要,您可以扩展此代码以实现更多功能,例如递归遍历子目录、过滤特定类型的文件等。