```
// 每个目录块包含多个目录项
DirEntry* dir_entries = (DirEntry*)(virtual_disk + block_num * BLOCK_SIZE);

// 示例：根目录结构
根目录块 (块0)
├── [0] "."      -> 块0      // 当前目录
├── [1] ".."     -> 块0      // 父目录（根目录的父目录是自己）
├── [2] "usr"    -> 块100    // 子目录
├── [3] "etc"    -> 块150    // 子目录
└── [4] "file.txt" -> 块200  // 文件

// usr 目录块 (块100)
├── [0] "."      -> 块100
├── [1] ".."     -> 块0       // 指向父目录（根目录）
├── [2] "bin"    -> 块101
└── [3] "local"  -> 块102
```



```
// 文件块链示例
// 文件 "test.txt" 占用块: 100 -> 150 -> 200 -> EOF
fat[100] = 150;   // 块100的下一个块是150
fat[150] = 200;   // 块150的下一个块是200
fat[200] = EOF_BLOCK;  // 文件结束
```



```C
// 执行: my_create("test.txt")
// 步骤1: 在根目录分配目录项
DirEntry* root_dir = (DirEntry*)(virtual_disk + 0);
// 假设在索引2的位置创建
strcpy(root_dir[2].filename, "test.txt");
root_dir[2].attr.is_dir = 0;
root_dir[2].first_block = 100;  // 分配块100作为首块
root_dir[2].file_size = 0;

// 步骤2: 分配数据块100
fat[100] = EOF_BLOCK;  // 标记为已分配，文件结束

// 此时状态
// 根目录项: test.txt -> first_block=100, size=0
// FAT[100] = EOF_BLOCK
```



```C
// 执行: fd = my_open("test.txt", 'w')
// 打开文件，获取文件描述符 fd=0

// 执行: my_write(fd, "Hello World! This is a test file.", 35)
// 写入35字节到文件

// 写入过程详解：
// 当前位置 current_pos = 0
// 当前块 current_block = 100
// 块内偏移 offset = 0
// 写入35字节到块100的0-34位置

// 写入后的状态：
// 块100内容: "Hello World! This is a test file." + 空闲(989字节)
// 文件大小: 35字节
// FAT[100] = EOF_BLOCK (还没用完一个块)
```

```C
// 执行: my_write(fd, large_buffer, 2000)
// 假设当前文件已有35字节，再写入2000字节

// 第一次写入（填充块100剩余空间）
// 块100已用35字节，剩余989字节
// 写入989字节，填满块100
current_pos = 35 + 989 = 1024  // 块100写满

// 检查是否需要新块
if (fat[100] == EOF_BLOCK) {
    // 分配新块150
    unsigned short new_block = alloc_block();  // 返回150
    fat[100] = new_block;  // 100 -> 150
    fat[150] = EOF_BLOCK;
}

// 第二次写入（继续写入剩余数据）
// 剩余数据: 2000 - 989 = 1011字节
// 写入到块150
// 块150偏移0开始写入1011字节

// 最终状态
// 块100: 已满 (1024字节)
// 块150: 已用1011字节，剩余13字节
// 文件大小: 35 + 2000 = 2035字节

// FAT表状态
fat[100] = 150;        // 100的下一个块是150
fat[150] = EOF_BLOCK;  // 150是最后一个块
```





```C
// 递归删除目录（需要添加的函数）
int my_rmdir_recursive(const char* dirname) {
    // 1. 切换到目标目录
    char old_dir[MAX_PATH_LENGTH];
    strcpy(old_dir, current_dir);
    
    if (my_cd(dirname) != 0) {
        return -1;
    }
    
    // 2. 遍历并删除所有内容
    DirEntry* entries = (DirEntry*)(virtual_disk + current_dir_block * BLOCK_SIZE);
    
    for (int i = 0; i < BLOCK_SIZE / sizeof(DirEntry); i++) {
        if (entries[i].filename[0] == '\0') continue;
        if (strcmp(entries[i].filename, ".") == 0) continue;
        if (strcmp(entries[i].filename, "..") == 0) continue;
        
        if (entries[i].attr.is_dir) {
            // 递归删除子目录
            my_rmdir_recursive(entries[i].filename);
        } else {
            // 删除文件
            my_rm(entries[i].filename);
        }
    }
    
    // 3. 返回原目录并删除空目录
    my_cd(old_dir);
    return my_rmdir(dirname);
}
```

