資源簡介
用一個文件虛擬為磁盤,在其上模擬多級目錄的FAT文件系統。并提供相應的用戶操作界面??梢蚤_發為控制臺應用程序或windows窗體程序。
功能:
實現基本的目錄和文件的操作。比如,目錄的切換,顯示當前路徑,顯示目錄內容,目錄和文件的建立、復制、刪除、重命名,文件內容顯示,文件導入(從真實的文件系統中導入一個文件存放到該模擬文件系統中),文件的導出(將模擬文件系統中的一個文件導出到真實的文件系統中)。

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
using?namespace?std;
#define?MAX_FILE_NAME?16???//?文件名最大長度
#define?INODE_NUM?100??????//?設備目錄區中可存放的I節點的個數
#define?BLOCK_NUM?1024?????//?文件區盤塊數
#define?BLOCK_SIZE?512?????//?文件盤塊大小
#define?MAX_COMMAND_NUM?10?//?用戶輸入的命令中參數最多個數
#define?MAX_COMMAND_LENGTH?20??//?用戶輸入命令的每個參數的最大長度
//數據結構定義
struct?VolumeInfo
{
long?iNodeTableAddress;??//設備目錄表地址
long?fatTableAddress;????//fat表地址
long?dataAreaAddress;????//數據表地址
long?totalSpace;?????????//總空間
long?usedBlock;??????????//占用塊數
long?leftSpace;??????????//剩余空間
};
struct?INode
{
long?index;????????//索引號
int?type;??????????//文件類型,0為目錄,1為文件,-1是空閑
long?address;??????//fat表區
long?size;?????????//文件大小
};
struct?Fat
{
long?nextAddress;??//塊鏈中下一塊是否存在,為-2表空閑,否則表占用
};
struct?FileIndex
{
char?name[MAX_FILE_NAME];?????//文件名
long?iNodeIndex;??????????????//索引號
};
//全局變量
int?fd;?????????????????????????????????????????????????//模擬文件系統的文件的文件描述符
VolumeInfo?volumeInfo;???????????????????????????????????//盤卷總信息
char?command[MAX_COMMAND_NUM][MAX_COMMAND_LENGTH];??????//存放用戶輸入的命令的字符串數組
int?commandNum;?????????????????????????????????????????//用于存放用戶輸入的命令的參數個數
INode?currentINode;?????????????????????????????????????//用戶當前目錄的描述信息
char?name[MAX_FILE_NAME][MAX_FILE_NAME];????????????????//當前路徑
//顯示命令提示符,并接受用戶輸入的命令
void?getCommand()
{
//處理用戶輸入的命令,放入command二維數組中
char?commandChar;????
int?commandLength;???//命令長度
commandNum?=?0;??????//命令個數????
commandLength?=?0;
while(1)
{
cout?<“Input?command:“;?//輸出命令提示符
cin?>>?commandChar;???????
while(commandChar?!=?‘\n‘)???//若輸入不為換行
{
if(commandChar?==?‘?‘)????//若輸入空格
{
if(commandLength?!=?0)??//若命令長度不為0
{
command[commandNum][commandLength]?=?‘\0‘;?????//參數輸入結束
commandNum++;??????????????????????????????????//進入下一個參數
commandLength?=?0;?????????????????????????????//置下一個參數長度為0
}
commandChar?=?getchar();??????
continue;??????????????????//進入下一次循環
}
else?????????//若輸入不為空格
{
command[commandNum][commandLength]?=?commandChar;???//將字符放入二維數組
commandLength++;????
}
commandChar?=?getchar();?
}
command[commandNum][commandLength]?=?‘\0‘;??//最后一個參數輸入結束
if(commandLength?>?0?)?????//如果長度大于0
commandNum++;??????//進入新的存儲字符區域
if(commandNum?!=?0)????????//如果命令參數不為0
break;?????????????//退出循環
}
}???
//清屏
void?vfs_clear()
{
system(“cls“);
}
//根據INode索引寫入INode
void?setINode(INode*?pINodelong?index)
{
pINode->index?=?index;
lseek(fdvolumeInfo.iNodeTableAddress?+?index?*?sizeof(INode)SEEK_SET);
write(fdpINodesizeof(INode));
}
//格式化
void?vfs_format()
{
int?i?=?0;
name[10][MAX_FILE_NAME]?=?0;
lseek(fd0SEEK_SET);??//移動文件讀寫指針到虛擬文件系統的開始處
//初始化盤卷總信息
volumeInfo.iNodeTableAddress?=?sizeof(VolumeInfo);??????
volumeInfo.fatTableAddress?=?volumeI
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????27108??2009-12-11?11:23??fat1.cpp
-----------?---------??----------?-----??----
????????????????27108????????????????????1
評論
共有 條評論