這是一個作業系統課程設計專案:模擬實現二級目錄文件系統。專案用disk.txt文本文件模擬硬碟,支援基本文件操作命令,root為超級用戶(預置於disk.txt)。
| 層面 | 設計選擇 |
|---|---|
| 文件邏輯結構 | 流式文件 |
| 物理結構 | 鏈接文件 |
| 物理空間管理 | 空閒鏈法 |
| 目錄結構 | 二級目錄結構 |
| 目錄搜索技術 | 線性搜索 |
| FCB | 含文件全部屬性 |
typedef struct mfd {
char username[14]; // 用戶名
char userpwd[14]; // 密碼
int link; // 該用戶UFD所在物理塊號
} MFD;
typedef struct {
char filename[14]; // 文件名
int mode; // 權限:0唯讀 1唯寫 2讀寫
int length; // 文件長度(字節)
int addr; // 首物理塊號
} UFD;
// 包含:文件名、屬性、狀態(打開/建立)、讀指針、寫指針
typedef struct cluster {
int num; // 物理塊號
long nextcluster; // 下一物理塊號
char data[256]; // 數據區(示例為256字節)
int is_data; // 是否為數據塊標記
} Cluster;
避免冗長的if-else或switch-case,定義命令處理結構體:
typedef void(*func)(void);
typedef struct hand {
char *pname;
func handler;
} HAND_TO;
HAND_TO handlerlist[] = {
{"Chmod", do_Chmod}, {"Chown", do_Chown}, {"Mv", do_Mv},
{"Copy", do_Copy}, {"Type", do_Type}, {"Passwd", do_Passwd},
{"Login", do_Login}, {"Logout", do_Logout}, {"Create", do_Create},
{"Delete", do_Delete}, {"Open", do_Open}, {"Close", do_Close},
{"Write", do_Write}, {"Read", do_Read}, {"Help", do_Help},
{"dir", do_dir}, {"sysc", do_sysc}, {"Register", do_register},
{"Exit", do_exit}, {"Clear", do_Clear}, {NULL, NULL}
};
單次for循環遍歷即可高效分發,代碼簡潔且易擴展。
難點:UFD僅記錄文件起始物理塊。寫指針只需記錄末塊偏移量即可追加;但讀指針位置不固定,若只記末塊偏移無法定位當前讀塊。
解法:讀指針記錄「當前總字節數」。
讀指針 / 256讀指針 % 256void do_Write() {
// 權限檢查、獲取起始塊、計算需新增塊數...
// 從空閒表分配新塊(首次適應法),鏈接形成鏈表
// 循環寫入數據,處理跨塊邊界
// 更新寫指針位置
}
vector存儲結構體),操作內存,sysc命令同步回磁碟本專案涵蓋文件系統核心機制,是理解作業系統存儲管理的優秀實踐案例。