// MyFileSystem.cpp : 定义控制台应用程序的入口点。
//
#include "MyFileSystem.h"//定义基本结构
#include <iostream>
#include <sstream>
using namespace std;
void usage();
Cmd* Cmd::instance = nullptr;
int main(int args, char* argv[]) {
Disk* disc = nullptr;
cout << "输入 help 获取帮助" << ",输入 Exit 退出" << endl;
string input_cmd;
Cmd* cmd = Cmd::getInstance(disc);
while (true) {
cout << cmd->getCwd() << " >>";
getline(cin, input_cmd);
if (input_cmd._Equal("Exit") || input_cmd._Equal("exit"))
break;
if (input_cmd._Equal("help")) {
usage();
continue;
}
auto flag = cmd->parse(input_cmd);
if (!flag) {
cout << "Error" << endl;
}
}
return 0;
}
bool Cmd::parse(string cmd) {
string* strings = split(cmd);
if (strings[0]._Equal("Format")) {
Format();
}
else if (disk == nullptr) {
cout << "硬盘未初始化!!!请输入 help 查看命令!!" << endl;
return false;
}
else if (strings[0]._Equal("MKfile")) {
Mk(cwd_inode_num,strings[1], false);
}
else if (strings[0]._Equal("MKdir")) {
Mk(cwd_inode_num,strings[1], true);
}
else if (strings[0]._Equal("Cd")) {
Cd(strings[1]);
}
else if (strings[0]._Equal("Delfile")) {
DelFile(strings[1],false);
}
else if (strings[0]._Equal("Deldir")) {
int level = 0;
DelDir(strings[1], level);
}
else if (strings[0]._Equal("Dir")) {
Dir();
}
else if (strings[0]._Equal("Copy")) {
Copy(strings[1], strings[2]);
}
else if (strings[0]._Equal("Open")) {
Open(strings[1]);
}
else if (strings[0]._Equal("Attrib")) {
Attrib(strings[2], strings[1]);
}
else if (strings[0]._Equal("Viewinodemap")) {
ViewINodeMap();
}
else if (strings[0]._Equal("Viewblockmap")) {
ViewBlockMap();
}
// else if (strings[0]._Equal("testDir")) {
// //创建大量目录以检测程序是否正确
// for (int i = 0; i < 70; i++) {
// string temp;
//
// stringstream ss;
//
// ss << i;
// ss >> temp;
// Mk(temp, true);
// }
// }
// else if (strings[0]._Equal("testFile")) {
// //创建大量文件以检测程序是否正确
// for (int i = 0; i < 70; i++) {
// string temp;
//
// stringstream ss;
//
// ss << i;
// ss >> temp;
// Mk(temp, false);
// }
// }
else {
cout << strings[0] << "找不到命令!请重新输入" << endl;
usage();
}
return true;
}
bool Cmd::Format() {
cout << "正在初始化硬盘……请等待" << endl;
disk = new Disk;
for (int i = 0; i < 1024; i++) {
disk->blockBitMap.blocks[i] = false;
if (i < 512)
disk->i_nodeBitMap.i_node_bitmap[i % 512] = false;
}
if (disk->dataBlocks != nullptr) {
cout << "初始化成功……" << endl;
head = new InodeLink(-1);
iNodeManager = new InodeLinkManager(head);
cwd_inode_num = -1;
cwd = "Root/";
return true;
}
return false;
}
bool Cmd::Mk(string dir, bool isDir) {
bool Cmd::Mk(int inode,string dir, bool isDir) {
if (dir._Equal("")) {
cout << "请输入参数" << endl;
return false;
}
int i_node_num;
if (inode != -1) {//非根目录
I_NODE* parentINode = &(disk->i_node_s[inode]);
if (parentINode->isFull(disk->dataBlocks)) {
cout << "该目录下已满,不能再添加任何" << (isDir ? "目录" : "文件") << endl;
return false;
}
//判断是否存在同名
if (isDir)//如果是一个目录,则判断是否有同名目录存在
{
int temp;
if (parentINode->existChild(dir, disk->dataBlocks, temp)) {//为真则表示是一个目录(可能不存在)
if (temp != -1) {//存在
cout << "同名" << (isDir ? "目录" : "文件") << "已经存在!!!" << endl;
return false;
}
}
}
else {//如果是创建文件,则判断是否有同名文件存在
int temp;
if (!parentINode->existChild(dir, disk->dataBlocks, temp)) {//为false则表示是一个目录
if (temp != -1) {//存在
cout << "同名" << (isDir ? "目录" : "文件") << "已经存在!!!" << endl;
return false;
}
}
}
if (disk->i_nodeBitMap.getAnINodeNum(i_node_num)) {//找到空i-node
disk->i_nodeBitMap.i_node_bitmap[i_node_num] = true;//更改对应i-node的状态
disk->i_node_s[i_node_num].init();//初始化i-node——主要是对时间的更改
disk->blockBitMap.getABlockNum(disk->i_node_s[i_node_num].directAddress[0]);
disk->blockBitMap.blocks[disk->i_node_s[i_node_num].directAddress[0]] = true;
parentINode->addChild(i_node_num, disk->dataBlocks, disk->blockBitMap, dir, isDir);//完成父节点到子节点的连接,true--目录
return true;
}
cout << "不存在空余i-node,无法创建" << (isDir ? "目录" : "文件") << "!";
disk->i_nodeBitMap.i_node_bitmap[i_node_num] = false;//不能创建相应的数据,i-node对应位应该置为false
return false;
}
//根节点
//判断是否存在同名
RootDirectory root = disk->rootDirectory;
for (size_t temp = 0; temp < 4; temp++) {
if (dir._Equal(root.direcoryEntries[temp].fileName)) {
cout << "同名" << (isDir ? "目录" : "文件") << "已经存在!!!" << endl;
return false;
}
}
int j;
if (root.getAnVoidDirecoryEntry(j))//获取可用根目录
{
if (disk->i_nodeBitMap.getAnINodeNum(i_node_num)) {
disk->i_nodeBitMap.i_node_bitmap[i_node_num] = true;
disk->i_node_s[i_node_num].init();
disk->blockBitMap.getABlockNum(disk->i_node_s[i_node_num].directAddress[0]);
disk->blockBitMap.blocks[disk->i_node_s[i_node_num].directAddress[0]] = true;
disk->rootDirectory.direcoryEntries[j].init(dir._Myptr(), isDir, i_node_num);
return true;
}
cout << "不存在空闲i-node" << endl;
return false;
}
cout << "根目录已满,不能再向其添加目录" << endl;
return false;
}
bool Cmd::Cd(string path) {
if (path._Equal("")) {
cout << "请输入参数" << endl;
return false;
}
if (path._Equal("..")) {
if (iNodeManager->getParent(cwd_inode_num)) {
string temp = cwd;
int i = temp.find_last_of('/');
temp = string(temp, 0, i);
i = temp.find_last_of('/');
temp = string(temp, 0, i + 1);
cwd = temp;
}
return true;
}
if (cwd_inode_num == -1)//根目录
{
for (size_t i = 0; i < 4; i++) {
DirectoryEntry direcoryEntry = disk->rootDirectory.direcoryEntries[i];
if (path._Equal(direcoryEntry.fileName)) {//同名
if (direcoryEntry.flag == 1) {//目录
cwd_inode_num = direcoryEntry.i_node_number;
iNodeManager->addInode(cwd_inode_num);
cwd = cwd + path + "/";
return true;
}
cout << path << "不是目录" << endl;
return false;
}
}
cout << path << "不存在" << endl;
return false;
}
int childINode;
bool isDir;
I_NODE parentINode = disk->i_node_s[cwd_inode_num];
isDir = parentINode.existChild(path, disk->dataBlocks, childINode);
if (childINode != -1) {//不等于-1则说明存在
if (isDir)//true表示目录
{
iNodeManager->addInode(cwd_inode_num);
cwd_inode_num = childINode;
cwd = cwd + path + "/";
return true;
}
cout << path << "不是目录" << endl;
return false;
}
cout << path << "不存在" << endl;
return true;
}
bool Cmd::DelFile(string path,bool del) {
//判断是否根目录
if (cwd_inode_num == -1) {
for (size_t i = 0; i < 4; i++) {
if (path._Equal(disk->rootDirectory.direcoryEntries[i].fileName)) {
if (del)
{
if (disk->i_node_s[disk->rootDirectory.direcoryEntries[i].i_node_number].isReadOnly == 0)
disk->i_node_s[disk->rootDirectory.direcoryEntries[i].i_node_number].clear(disk->dataBlocks, disk->blockBitMap);
disk->i_nodeBitMap.i_node_bitmap[disk->rootDirectory.direcoryEntries[i].i_node_number] = false;
disk->rootDirectory.direcoryEntries[i].fileName[0] = '\0';
disk->rootDirectory.direcoryEntries[i].flag = -1;
disk->rootDirectory.direcoryEntries[i].i_node_number = -1;
return true;
}
if (disk->rootDirectory.direcoryEntries[i].flag == 0)//如果是文件
{
if(disk->i_node_s[disk->rootDirectory.direcoryEntries[i].i_node_number].isReadOnly==0)
disk->i_