在CentOS或其他Linux系统中,readdir函数用于读取目录的内容。为了设计一个高效的数据结构来存储和处理目录信息,我们可以考虑以下步骤:
定义目录项结构: 每个目录项通常包含文件名、文件类型(如普通文件、目录、符号链接等)、文件大小、修改时间等信息。我们可以定义一个结构体来表示这些信息。
typedef struct dirent {
ino_t d_ino; // inode号
off_t d_off; // 偏移量
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型
char d_name[]; // 文件名,以null结尾
} dirent;
定义目录结构: 目录本身也可以看作是一个特殊的文件,包含了一系列的目录项。我们可以定义一个结构体来表示目录,其中包含目录项的数组和目录项的数量。
typedef struct directory {
char name[]; // 目录名,以null结尾
int num_entries; // 目录项数量
dirent entries[]; // 目录项数组
} directory;
读取目录内容:
使用readdir函数读取目录内容时,我们需要将读取到的信息填充到我们定义的目录项结构中。
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
directory* read_directory(const char* path) {
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return NULL;
}
struct dirent *entry;
int count = 0;
while ((entry = readdir(dir)) != NULL) {
count++;
}
closedir(dir);
// 分配内存
directory *dir_struct = (directory *)malloc(sizeof(directory) + count * sizeof(dirent));
if (!dir_struct) {
perror("malloc");
return NULL;
}
dir_struct->num_entries = count;
dir_struct->name = strdup(path);
dir = opendir(path);
if (!dir) {
perror("opendir");
free(dir_struct);
return NULL;
}
count = 0;
while ((entry = readdir(dir)) != NULL) {
strncpy(dir_struct->entries[count].d_name, entry->d_name, sizeof(dir_struct->entries[count].d_name));
dir_struct->entries[count].d_ino = entry->d_ino;
dir_struct->entries[count].d_off = entry->d_off;
dir_struct->entries[count].d_reclen = entry->d_reclen;
dir_struct->entries[count].d_type = entry->d_type;
count++;
}
closedir(dir);
return dir_struct;
}
void free_directory(directory *dir_struct) {
if (dir_struct) {
free(dir_struct->name);
free(dir_struct);
}
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <directory_path>\n", argv[0]);
return 1;
}
directory *dir = read_directory(argv[1]);
if (!dir) {
return 1;
}
for (int i = 0; i < dir->num_entries; i++) {
printf("Name: %s, Inode: %ld, Type: %c\n", dir->entries[i].d_name, dir->entries[i].d_ino, dir->entries[i].d_type);
}
free_directory(dir);
return 0;
}
这个示例代码展示了如何读取一个目录的内容,并将其存储在我们自定义的directory结构中。注意,这个示例是为了说明目的而简化的,实际应用中可能需要处理更多的错误情况和边界条件。