#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) {
    print_directory(fs.dirs[0]);
}

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--;
}

int main() {
    FileSystem fs;
    fs.dir_count = 1;

    // Create root directory
    Directory root;
    strcpy(root.name, '/');
    root.file_count = 0;
    fs.dirs[0] = root;

    // Main loop
    while (1) {
        char command[100];
        printf('> ');
        scanf('%s', command);

        if (strcmp(command, 'ls') == 0) {
            print_directory(fs.dirs[0]);
        } else if (strcmp(command, 'cd') == 0) {
            char dir_name[MAX_FILENAME_LENGTH];
            scanf('%s', dir_name);
            int dir_index = find_directory(fs, dir_name);
            if (dir_index == -1) {
                printf('Error: Directory not found.\n');
            } else {
                print_directory(fs.dirs[dir_index]);
            }
        } else if (strcmp(command, 'mkdir') == 0) {
            char dir_name[MAX_FILENAME_LENGTH];
            scanf('%s', dir_name);
            add_directory(&fs, dir_name);
        } else if (strcmp(command, 'touch') == 0) {
            char file_name[MAX_FILENAME_LENGTH];
            int file_size;
            scanf('%s %d', file_name, &file_size);
            add_file(&fs, '/', file_name, file_size);
        } else if (strcmp(command, 'rm') == 0) {
            char file_name[MAX_FILENAME_LENGTH];
            scanf('%s', file_name);
            remove_file(&fs, '/', file_name);
        } else if (strcmp(command, 'rmdir') == 0) {
            char dir_name[MAX_FILENAME_LENGTH];
            scanf('%s', dir_name);
            remove_directory(&fs, dir_name);
        } else if (strcmp(command, 'exit') == 0) {
            break;
        } else {
            printf('Error: Invalid command.\n');
        }
    }

    return 0;
}

代码说明

该代码实现了一个简单的命令行文件管理器,支持以下命令:

  1. ls:列出当前目录下的所有文件和子目录。
  2. cd <dir>:进入指定的子目录。
  3. mkdir <dir>:创建一个新的子目录。
  4. touch <file> <size>:在当前目录下创建一个指定大小的新文件。
  5. rm <file>:删除当前目录下的指定文件。
  6. rmdir <dir>:删除当前目录下的指定子目录及其所有文件。
  7. exit:退出文件管理器。

代码中使用了三个结构体来表示文件系统:

  • File:表示一个文件,包含文件名和文件大小。
  • Directory:表示一个目录,包含目录名、文件数量和文件列表。
  • FileSystem:表示整个文件系统,包含目录数量和目录列表。

代码中定义了若干函数来实现文件管理器的功能,例如:

  • print_file:打印文件信息。
  • print_directory:打印目录信息。
  • print_filesystem:打印文件系统信息。
  • find_directory:查找指定名称的目录。
  • find_file:查找指定名称的文件。
  • add_directory:添加新目录。
  • add_file:添加新文件。
  • remove_directory:删除目录。
  • remove_file:删除文件。

main函数中,首先创建了一个根目录,然后进入循环,不断读取用户输入的命令并执行相应的操作。

C语言实现简单文件管理系统

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

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