#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 \n"); printf(" add file \n"); printf(" remove directory \n"); printf(" remove file \n"); printf(" rename directory \n"); printf(" rename file \n"); printf(" move file \n"); printf(" move directory \n"); printf(" help\n"); printf(" exit\n"); }

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;

}

C 语言实现文件系统模拟 - 完整代码详解

原文地址: https://www.cveoy.top/t/topic/f1wt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录