C 语言实现文件系统模拟 - 完整代码详解
#include <stdio.h> #include <stdlib.h> #include <string.h>
#define MAX_FILENAME_LENGTH 100 #define MAX_FILE_COUNT 100 #define MAX_DIR_COUNT 100
typedef struct { char name[MAX_FILENAME_LENGTH]; int size; } File;
typedef struct { char name[MAX_FILENAME_LENGTH]; int file_count; File files[MAX_FILE_COUNT]; } Directory;
typedef struct { int dir_count; Directory dirs[MAX_DIR_COUNT]; } FileSystem;
void print_file(File file) { printf("%s (%d bytes)\n", file.name, file.size); }
void print_directory(Directory dir) { printf("%s:\n", dir.name); for (int i = 0; i < dir.file_count; i++) { printf(" "); print_file(dir.files[i]); } }
void print_filesystem(FileSystem fs) { for (int i = 0; i < fs.dir_count; i++) { print_directory(fs.dirs[i]); } }
int find_directory(FileSystem fs, char* name) { for (int i = 0; i < fs.dir_count; i++) { if (strcmp(fs.dirs[i].name, name) == 0) { return i; } } return -1; }
int find_file(Directory dir, char* name) { for (int i = 0; i < dir.file_count; i++) { if (strcmp(dir.files[i].name, name) == 0) { return i; } } return -1; }
void add_directory(FileSystem* fs, char* name) { if (fs->dir_count >= MAX_DIR_COUNT) { printf("Error: Maximum directory count reached.\n"); return; } int index = find_directory(*fs, name); if (index != -1) { printf("Error: Directory already exists.\n"); return; } Directory dir; strcpy(dir.name, name); dir.file_count = 0; fs->dirs[fs->dir_count] = dir; fs->dir_count++; }
void add_file(FileSystem* fs, char* dir_name, char* name, int size) { int dir_index = find_directory(fs, dir_name); if (dir_index == -1) { printf("Error: Directory not found.\n"); return; } Directory dir = &fs->dirs[dir_index]; if (dir->file_count >= MAX_FILE_COUNT) { printf("Error: Maximum file count reached.\n"); return; } int index = find_file(*dir, name); if (index != -1) { printf("Error: File already exists.\n"); return; } File file; strcpy(file.name, name); file.size = size; dir->files[dir->file_count] = file; dir->file_count++; }
void remove_directory(FileSystem* fs, char* name) { int index = find_directory(*fs, name); if (index == -1) { printf("Error: Directory not found.\n"); return; } for (int i = index; i < fs->dir_count - 1; i++) { fs->dirs[i] = fs->dirs[i + 1]; } fs->dir_count--; }
void remove_file(FileSystem* fs, char* dir_name, char* name) { int dir_index = find_directory(fs, dir_name); if (dir_index == -1) { printf("Error: Directory not found.\n"); return; } Directory dir = &fs->dirs[dir_index]; int index = find_file(*dir, name); if (index == -1) { printf("Error: File not found.\n"); return; } for (int i = index; i < dir->file_count - 1; i++) { dir->files[i] = dir->files[i + 1]; } dir->file_count--; }
void rename_directory(FileSystem* fs, char* old_name, char* new_name) { int index = find_directory(*fs, old_name); if (index == -1) { printf("Error: Directory not found.\n"); return; } int new_index = find_directory(*fs, new_name); if (new_index != -1) { printf("Error: Directory with new name already exists.\n"); return; } strcpy(fs->dirs[index].name, new_name); }
void rename_file(FileSystem* fs, char* dir_name, char* old_name, char* new_name) { int dir_index = find_directory(fs, dir_name); if (dir_index == -1) { printf("Error: Directory not found.\n"); return; } Directory dir = &fs->dirs[dir_index]; int index = find_file(*dir, old_name); if (index == -1) { printf("Error: File not found.\n"); return; } int new_index = find_file(*dir, new_name); if (new_index != -1) { printf("Error: File with new name already exists.\n"); return; } strcpy(dir->files[index].name, new_name); }
void move_file(FileSystem* fs, char* old_dir_name, char* file_name, char* new_dir_name) { int old_dir_index = find_directory(fs, old_dir_name); if (old_dir_index == -1) { printf("Error: Old directory not found.\n"); return; } Directory old_dir = &fs->dirs[old_dir_index]; int file_index = find_file(*old_dir, file_name); if (file_index == -1) { printf("Error: File not found.\n"); return; } int new_dir_index = find_directory(fs, new_dir_name); if (new_dir_index == -1) { printf("Error: New directory not found.\n"); return; } Directory new_dir = &fs->dirs[new_dir_index]; if (new_dir->file_count >= MAX_FILE_COUNT) { printf("Error: Maximum file count reached in new directory.\n"); return; } if (find_file(*new_dir, file_name) != -1) { printf("Error: File with same name already exists in new directory.\n"); return; } new_dir->files[new_dir->file_count] = old_dir->files[file_index]; new_dir->file_count++; for (int i = file_index; i < old_dir->file_count - 1; i++) { old_dir->files[i] = old_dir->files[i + 1]; } old_dir->file_count--; }
void move_directory(FileSystem* fs, char* old_dir_name, char* new_dir_name) { int old_dir_index = find_directory(*fs, old_dir_name); if (old_dir_index == -1) { printf("Error: Old directory not found.\n"); return; } int new_dir_index = find_directory(*fs, new_dir_name); if (new_dir_index != -1) { printf("Error: Directory with same name already exists in new directory.\n"); return; } Directory old_dir = fs->dirs[old_dir_index]; remove_directory(fs, old_dir_name); add_directory(fs, new_dir_name); int index = find_directory(*fs, new_dir_name); fs->dirs[index] = old_dir; }
void display_help() {
printf("Commands:\n");
printf(" add directory
int main() { FileSystem fs; fs.dir_count = 0;
add_directory(&fs, "Documents");
add_directory(&fs, "Pictures");
add_directory(&fs, "Music");
add_file(&fs, "Documents", "report.txt", 1024);
add_file(&fs, "Pictures", "vacation.jpg", 2048);
add_file(&fs, "Music", "song.mp3", 4096);
printf("Initial filesystem:\n");
print_filesystem(fs);
char command[100];
char arg1[100];
char arg2[100];
char arg3[100];
char arg4[100];
int size;
while (1) {
printf("Enter command (type 'help' for list of commands): ");
scanf("%s", command);
if (strcmp(command, "add") == 0) {
scanf("%s", arg1);
if (strcmp(arg1, "directory") == 0) {
scanf("%s", arg2);
add_directory(&fs, arg2);
} else if (strcmp(arg1, "file") == 0) {
scanf("%s %s %d", arg2, arg3, &size);
add_file(&fs, arg2, arg3, size);
} else {
printf("Error: Invalid arguments.\n");
}
} else if (strcmp(command, "remove") == 0) {
scanf("%s", arg1);
if (strcmp(arg1, "directory") == 0) {
scanf("%s", arg2);
remove_directory(&fs, arg2);
} else if (strcmp(arg1, "file") == 0) {
scanf("%s %s", arg2, arg3);
remove_file(&fs, arg2, arg3);
} else {
printf("Error: Invalid arguments.\n");
}
} else if (strcmp(command, "rename") == 0) {
scanf("%s", arg1);
if (strcmp(arg1, "directory") == 0) {
scanf("%s %s", arg2, arg3);
rename_directory(&fs, arg2, arg3);
} else if (strcmp(arg1, "file") == 0) {
scanf("%s %s %s", arg2, arg3, arg4);
rename_file(&fs, arg2, arg3, arg4);
} else {
printf("Error: Invalid arguments.\n");
}
} else if (strcmp(command, "move") == 0) {
scanf("%s", arg1);
if (strcmp(arg1, "directory") == 0) {
scanf("%s %s", arg2, arg3);
move_directory(&fs, arg2, arg3);
} else if (strcmp(arg1, "file") == 0) {
scanf("%s %s %s", arg2, arg3, arg4);
move_file(&fs, arg2, arg3, arg4);
} else {
printf("Error: Invalid arguments.\n");
}
} else if (strcmp(command, "help") == 0) {
display_help();
} else if (strcmp(command, "exit") == 0) {
break;
} else {
printf("Error: Invalid command.\n");
}
print_filesystem(fs);
}
return 0;
}
原文地址: https://www.cveoy.top/t/topic/f1wt 著作权归作者所有。请勿转载和采集!