亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? filesystem.cpp

?? LINUX 設計一個簡單的二級文件系統
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include "FileSystem.h"
#include "string2"
#include "Util.h"

SuperBlock sb;
FILE* fd;
hinode hinode[NHINO];
SysOFile sys_ofile[100];

unsigned long FileSystem::mapAddr(unsigned int id) {
	unsigned long addr;
	addr = this->IN_Start+sizeof(DInode)*(id-1);
	return addr;
}
void FileSystem::SaveSuperBlock() {
	fseek(fd, 0, 0);
	fwrite(&sb, 1, sizeof(SuperBlock), fd);
}
FileSystem::~FileSystem() {}
FileSystem::FileSystem() {
	strcpy(this->Disk_Name, "FileSystem.disk");
	this->LoginNum = 0;
	this->IN_Start = BlockSize * 2;
	this->Data_Start = BlockSize * (2 + 400);
	this->GroupSize = 50;
}

void FileSystem::ShowList(const char* usn) {
	if (!this->CheckLogin(usn)) return;
	unsigned int curDir = this->LoginUser[this->UNameI(usn)].CurDirInodeID;
	INode* inode = this->IGet(curDir);
	Direct dir;
	fseek(fd, inode->addr[0]*BlockSize, 0);
	fread(&dir, 1, sizeof(Direct), fd);
	this->IPut(inode);
	int i = 0;
	if (curDir != this->LoginUser[this->UNameI(usn)].user.Dino) {
		i = 1;
		cout << "文件總數: " << dir.size-1 << endl;
	} else {
		cout << "文件總數: " << dir.size << endl;
	}

	for (; i<dir.size; i++) {
		cout << "名稱:" << dir.files[i].name << '\t';
		inode = this->IGet(dir.files[i].Dino);
		if (inode->size == 0)
			cout << "物理地址:" << this->mapAddr(inode->Dino) << "\t大小:" << "1 KB";
		else
			cout << "物理地址:" << inode->addr[0]*BlockSize << "\t大小:" << inode->size << " KB";
		cout << "\t保護碼:" << inode->type;
		int di_mode, one;
		for (int j=0; j<4; j++) {
			di_mode = inode->mode;
			one = di_mode % 2;
			di_mode = di_mode / 2;
			if (one) cout << 'x';
			else cout << '*';
		}
		cout << endl;
	}
}

void FileSystem::MakeDir(const char *usn, const char *name) {
	if (!this->CheckLogin(usn)) return;
	if (!u.regTest("^[a-zA-Z0-9._]{1,16}$", name)) {
		cout << "目錄名稱只能是1至16位字母或數字或點號下劃線組成!" << endl;
		return;
	}
	unsigned int dinodeid = this->NameI(usn, name);
	if (dinodeid != 0) {
		cout << "相同名稱的文件或目錄已經存在!" << endl;
		return;
	}
	Direct dir;
	dir.size = 1;
	strcpy(dir.files[0].name, "..");
	dir.files[0].Dino = this->LoginUser[this->UNameI(usn)].CurDirInodeID;
	unsigned int Bid = this->BAlloc();
	if (Bid == 0) {
		return;
	}
	INode* inode = this->IAlloc();
	if (inode == NULL) {
		this->BFree(Bid);
		return;
	}
	fseek(fd, Bid*BlockSize, 0);
	fwrite(&dir, 1, sizeof(Direct), fd);
	inode->size = 1;
	inode->addr[0] = Bid;
	inode->type = 'd';
	inode->mode = '0';
	Bid = inode->Dino;
	this->IPut(inode);
	File file;
	strcpy(file.name, name);
	file.Dino = Bid;
	unsigned int curDir = this->LoginUser[this->UNameI(usn)].CurDirInodeID;
	INode* inode2 = this->IGet(curDir);
	fseek(fd, inode2->addr[0]*BlockSize, 0);
	fread(&dir, 1, sizeof(Direct), fd);
	dir.files[dir.size] = file;
	dir.size++;
	fseek(fd, inode2->addr[0]*BlockSize, 0);
	fwrite(&dir, 1, sizeof(Direct), fd);
	this->IPut(inode2);

	cout << "目錄創建成功!" << endl;
}

// 創建文件
void FileSystem::MakeFile(const char *usn, const char *filename) {
	if (!this->CheckLogin(usn)) return; // 用戶登錄檢測
	if (!u.regTest("^[a-zA-Z0-9._]{1,16}$", filename)) { // 文件名合法性檢測
		cout << "文件名稱只能是1至16位字母或數字或點號下劃線組成!" << endl;
		return;
	}
	// 調用 NameI 方法通過名稱找到索引節點編號
	unsigned int dinodeid = this->NameI(usn, filename);
	if (dinodeid != 0) {
		cout << "相同名稱的文件或目錄已經存在!" << endl;
		return;
	}
	// 分配 索引節點
	INode* inode = this->IAlloc();
	if (inode == NULL) return;
	// 填入初始化信息
	inode->size = 0;
	inode->type = 'f';
	inode->mode = '1';
	// 初始化文件
	File file;
	strcpy(file.name, filename);
	file.Dino = inode->Dino;
	this->IPut(inode);
	// 將新文件插入目錄表中
	unsigned int curDir = this->LoginUser[this->UNameI(usn)].CurDirInodeID;
	INode* inode2 = this->IGet(curDir);
	Direct dir;
	fseek(fd, inode2->addr[0]*BlockSize, 0);
	fread(&dir, 1, sizeof(Direct), fd);
	dir.files[dir.size] = file;
	dir.size++;
	fseek(fd, inode2->addr[0]*BlockSize, 0);
	fwrite(&dir, 1, sizeof(Direct), fd);
	this->IPut(inode2);
	cout << "文件創建成功!" << endl;
}


void FileSystem::IFree(unsigned int dinodeid) {
	unsigned int id;
	unsigned long addr;
	DInode dino;
	if (sb.pFI == 100) { // 棧滿
		for (int i=0; i<50; i++) { // 取一半存盤
			id = sb.FIS[sb.pFI-1];
			addr = this->mapAddr(id);
			fseek(fd, addr, 0);
			fread(&dino, 1, sizeof(DInode), fd);
			dino.type = 's';
			fwrite(&dino, 1, sizeof(DInode), fd);
		}
	}
	sb.FIS[sb.pFI] = dinodeid;
	sb.FINum++;
	sb.pFI++;
}

INode* FileSystem::IAlloc() {
	INode* temp_inode;
	int i, count;
	unsigned long addr;
	if (sb.FINum == 0) {
		cout << "無法再分配更多的 I 結點!" << endl;
		return NULL;
	}
	if (sb.pFI == 0) { // 棧空, 補棧
		i = 0;
		count = 0;
		DInode in;
		for (i=0; i<IBlockNum*BlockSize/sizeof(DInode); i++) {
			addr = this->mapAddr(i);
			fseek(fd, addr, 0);
			fread(&in, 1, sizeof(DInode), fd);
			if (in.type == 'e') {
				sb.FIS[sb.pFI] = in.no;
				in.type = 's';
				fseek(fd, addr, 0);
				fwrite(&in, 1, sizeof(DInode), fd);
				sb.pFI++;
				count++;
				if (count == 50) {
					break;
				}
			}
		}
	}
	unsigned int id = sb.FIS[sb.pFI-1];
	temp_inode = this->IGet(id);
	//temp_inode->type = 's';
	addr = this->mapAddr(id);
	fseek(fd, addr, 0);
	fwrite(&temp_inode->di_number, 1, sizeof(DInode), fd);
	sb.pFI--;
	sb.FINum--;
	sb.SysMod = 0;
	this->SaveSuperBlock();
	return temp_inode;
}


INode* FileSystem::IGet(unsigned int dinodeid) {
	int inodeid = dinodeid % NHINO;
	int existed = 0;
	long addr;
	INode *temp, *newinode;

	if (hinode[inodeid].iForw != NULL) {
		// 如果 HASH 表中該 HASH 隊列不為空, 查找節點
		temp = hinode[inodeid].iForw;
		while (temp) {
			if (temp->i_ino == inodeid) {
				// 如果找到該索引節點
				existed = 1;
				temp->Icount++;
				return temp;
			} else {
				temp = temp->iForw;
			}
		}
	}
	// HASH 表中不存在該節點, 則計算對應磁盤 I節點 地址
	addr = this->mapAddr(dinodeid);

	// 分配內存, 并從磁盤載入信息
	newinode = (INode*)malloc(sizeof(INode));
	fseek(fd, addr, 0);
	fread(&newinode->di_number, 1, sizeof(DInode), fd);

	// 將該節點置入 HASH 表中
	newinode->iForw = hinode[inodeid].iForw;
	newinode->iBack = newinode;
	if (newinode->iForw != NULL) {
		newinode->iForw->iBack = newinode;
	}
	hinode[inodeid].iForw = newinode;
	
	// 填好初始化信息
	newinode->Icount = 1;
	newinode->flag = 0;				// 標記是否被更新
	newinode->i_ino = inodeid;


	// newinode->di_size=3*(DIRSIZ+2);
	// if(dinodeid == 3) newinode->di_size=BLOCKSIZ;
	return newinode;
}

void FileSystem::IPut(INode* pinode) {
	unsigned long addr;
	addr = this->mapAddr(pinode->Dino);
	fseek(fd, addr, 0);
	fwrite(&pinode->di_number, 1, sizeof(DInode), fd);
	if (pinode->Icount > 1) {
		pinode->Icount--;
		return;
	}

	if (pinode->iForw == NULL) {
		pinode->iBack->iForw = NULL;
	} else {
		pinode->iForw->iBack = pinode->iBack;
		pinode->iBack->iForw = pinode->iForw;
	}
	/*
	if (pinode->di_number != 0) {
		addr = this->mapAddr(pinode->Dino);
		fseek(fd, addr, 0);
		fwrite(&pinode->di_number, 1, sizeof(DInode), fd);
	} else {
		for (int i=0; i<pinode->size; i++) {
			this->BFree(pinode->addr[i]);
		}
		//this->IFree(pinode->Dino);
	}
	if (pinode->iForw == NULL) {
		pinode->iBack->iForw = NULL;
	} else {
		pinode->iForw->iBack = pinode->iBack;
		pinode->iBack->iForw = pinode->iForw;
	}
	this->IFree(pinode->Dino);*/
}

unsigned int FileSystem::NameI(const char *usn, const char *name) {
	if (0==strcmp("/", name)) {
		return this->LoginUser[this->UNameI(usn)].user.Dino;
	} else if (0==strcmp(".", name)) {
		return this->LoginUser[this->UNameI(usn)].CurDirInodeID;
	} else {
		unsigned int curDir = this->LoginUser[this->UNameI(usn)].CurDirInodeID;
		INode* inode = this->IGet(curDir);
		Direct dir;
		fseek(fd, inode->addr[0] * BlockSize, 0);
		fread(&dir, 1, sizeof(Direct), fd);
		this->IPut(inode);
		for (int i=0; i<dir.size; i++) {
			if (strcmp(dir.files[i].name, name)==0) {
				return dir.files[i].Dino;
			}
		}
		return 0;
	}
}

void FileSystem::ChangeDir(const char *usn, const char *name) {
	if (!this->CheckLogin(usn)) return;
	int dinodeid = this->NameI(usn, name);
	if (dinodeid==0) {
		cout << "目錄不存在!" << endl;
		return;
	}
	INode* inode = this->IGet(dinodeid);
	if (inode == NULL) {
		cout << "目錄不存在!" << endl;
		return;
	}
	if (inode->type != 'd') {
		cout << "目錄不存在!" << endl;
		return;
	}
	// cout << "當前目錄:" << name << endl;
	int uid = this->UNameI(usn);
	this->LoginUser[uid].CurDirInodeID = dinodeid;
}

bool FileSystem::Login(const char *usn, const char *pwd) {
	if (this->LoginNum > 3) {
		cout << "當前系統太多人登錄,請稍后登錄!" << endl;
		return 0;
	}
	int i;
	for (i=0; i<this->LoginNum; i++) {
		if (strcmp(usn, this->LoginUser[i].user.usn)==0) {
			cout << "您已經登陸,不用重復登錄!" << endl;
			return 0;
		}
	}
	for (i=0; i<4; i++) {
		if (strcmp(this->AllUser[i].usn, usn)==0 && strcmp(this->AllUser[i].pwd, pwd)==0) {
			cout << "登錄成功!" << endl;
			this->LoginUser[this->LoginNum].user = this->AllUser[i];
			this->LoginNum++;
			LoginUser[this->LoginNum].CurDirInodeID = this->AllUser[i].Dino;
			this->ChangeDir(usn, "/");
			return 1;
		}
	}
	cout << "你輸入的用戶名或者密碼不正確!" << endl;
	return 0;
}

void FileSystem::Logout(const char *usn) {
	if (!this->CheckLogin(usn)) return;
	int j, k;
	for (int i=0; i<this->LoginNum; i++) {
		if (strcmp(this->LoginUser[i].user.usn, usn)==0) {
			int uid = this->UNameI(usn);
			for (k=0; k<100; k++) {
				if (sys_ofile[k].f_count > 0 && sys_ofile[k].uid == uid) {
					this->Close(usn, k);
				}
			}
			for (j=i; j<3; j++) {
				this->LoginUser[j] = this->LoginUser[j+1];
			}
			this->LoginNum--;
			cout << "登出成功!" << endl;
			return;
		}
	}
}

int FileSystem::CheckLogin(const char *usn) {
	for (int i=0; i<this->LoginNum; i++) {
		if (strcmp(this->LoginUser[i].user.usn, usn)==0) {
			return 1;
		}
	}
	cout << "對不起,您還未登錄,請先登錄!" << endl;
	return 0;
}

void FileSystem::Load() {
	fd = fopen(this->Disk_Name, "r+w+b");
	if (fd == NULL) {
		cout << "文件系統無法加載!" << endl;
		exit(0);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆国产自产在线观看| 色94色欧美sute亚洲线路一久| 免费在线观看精品| 国产河南妇女毛片精品久久久| 不卡一区在线观看| 日韩欧美中文字幕制服| 国产片一区二区| 亚洲午夜电影在线| 国产呦萝稀缺另类资源| 色菇凉天天综合网| 久久综合九色综合97婷婷女人| 婷婷综合久久一区二区三区| 精品在线免费视频| 日本韩国精品一区二区在线观看| 欧美一级二级三级蜜桃| 最新不卡av在线| 狠狠久久亚洲欧美| 日本精品视频一区二区三区| 久久久国产精华| 亚洲电影你懂得| 成人中文字幕合集| 欧美一区二区在线免费观看| 亚洲色图制服诱惑| 国产成人综合网站| 91麻豆精品国产91久久久更新时间| 国产嫩草影院久久久久| 日韩精品一二三| 色丁香久综合在线久综合在线观看| 日韩精品一区二区三区视频在线观看| 亚洲嫩草精品久久| 国产成人免费在线视频| 欧美一区二区三区男人的天堂| 亚洲精品视频在线| 波多野结衣中文字幕一区 | 日韩一区在线播放| 久久99精品国产麻豆婷婷洗澡| 欧美区视频在线观看| 中文字幕佐山爱一区二区免费| 国产成人精品亚洲777人妖 | 欧美三级视频在线| 日韩理论片在线| 成人av网站在线| 欧美极品少妇xxxxⅹ高跟鞋 | 色综合天天综合网天天狠天天| 国产日韩欧美a| 久久99精品视频| 欧美日韩精品是欧美日韩精品| 亚洲人亚洲人成电影网站色| 狠狠色狠狠色综合| 欧美日韩一区精品| 亚洲午夜在线观看视频在线| 在线观看视频欧美| 亚洲一区二区三区影院| 欧美午夜不卡在线观看免费| 亚洲免费观看视频| 色爱区综合激月婷婷| 亚洲女人****多毛耸耸8| 91色九色蝌蚪| 亚洲精品大片www| 欧美性一区二区| 日韩成人免费电影| 日韩一区二区三区四区五区六区| 蜜乳av一区二区三区| 欧美二区在线观看| 日韩电影在线观看一区| 日韩三级视频在线看| 黄色日韩三级电影| 中文字幕乱码亚洲精品一区| 91在线播放网址| 亚洲一区二区精品久久av| 欧美日韩一级二级三级| 美女在线视频一区| 国产日韩精品一区二区浪潮av| 国产98色在线|日韩| 中文字幕一区二区三区精华液| 91影视在线播放| 亚洲午夜在线视频| 日韩精品专区在线影院重磅| 免费的成人av| 中文字幕不卡一区| 欧美在线视频全部完| 蜜臀99久久精品久久久久久软件| 精品国产三级电影在线观看| 丝袜美腿亚洲色图| 精品黑人一区二区三区久久| 成人aa视频在线观看| 午夜视频一区二区| 欧美xxx久久| 大白屁股一区二区视频| 国产精品久久福利| 日韩亚洲电影在线| 色综合久久久久综合99| 精品亚洲porn| 亚洲一区二区在线观看视频| 久久九九久久九九| 欧美群妇大交群的观看方式| 成人午夜精品一区二区三区| 亚洲国产毛片aaaaa无费看| 欧美精品一区二区在线播放| 91啪亚洲精品| 极品少妇xxxx精品少妇| 亚洲高清一区二区三区| 国产精品久久久久久久久搜平片| 99久久免费视频.com| 精品亚洲国产成人av制服丝袜| 一区二区三区日韩精品| 久久亚洲二区三区| 欧美日本精品一区二区三区| av一区二区三区在线| 免费高清在线一区| 亚洲一区在线视频观看| 欧美韩国日本一区| 精品三级在线观看| 欧美日韩国产大片| 99久久精品国产一区| 国产一区二区三区四区五区入口| 午夜精品久久久久久久99樱桃| 亚洲桃色在线一区| 亚洲国产成人午夜在线一区| 精品三级av在线| 日韩欧美国产精品| 在线看日韩精品电影| 成人一区二区三区| 激情久久五月天| 亚洲成人动漫av| 一区二区国产视频| 日本一区二区免费在线观看视频| 日韩精品在线网站| 欧美三级电影在线看| 国产老女人精品毛片久久| 三级欧美在线一区| 亚洲h精品动漫在线观看| 亚洲一线二线三线久久久| 一区二区不卡在线播放| 亚洲女爱视频在线| 一区二区三区欧美| 亚洲精品成人精品456| 亚洲精品国产高清久久伦理二区| 亚洲日本va在线观看| 自拍偷拍国产亚洲| 亚洲柠檬福利资源导航| 亚洲精品老司机| 性做久久久久久久久| 日韩不卡一二三区| 蜜桃视频一区二区| 国产在线观看免费一区| 国产成人免费9x9x人网站视频| 国产成人啪午夜精品网站男同| 成人av动漫在线| 在线亚洲高清视频| 欧美日韩亚洲综合| 欧美一区二区三区影视| 精品99久久久久久| 中文字幕巨乱亚洲| 亚洲精品欧美二区三区中文字幕| 亚洲欧美激情一区二区| 亚洲第一狼人社区| 麻豆精品在线视频| 国产91丝袜在线18| 91热门视频在线观看| 欧美日韩国产综合一区二区三区| 日韩视频一区在线观看| 性感美女久久精品| 久久狠狠亚洲综合| 风流少妇一区二区| 国产成人免费av在线| av电影一区二区| 欧美高清www午色夜在线视频| 久久婷婷成人综合色| 中文字幕亚洲一区二区av在线| 亚洲国产一区在线观看| 国内外成人在线| 国产jizzjizz一区二区| 蜜桃av一区二区三区| 国产精品一区二区视频| 欧美精品日韩一本| 亚洲自拍与偷拍| 91久久精品国产91性色tv| 18成人在线视频| 丰满白嫩尤物一区二区| 2020国产成人综合网| 久久精品72免费观看| 欧美精品丝袜中出| 亚洲一区二区精品久久av| 91麻豆免费观看| 国产精品久久久久久福利一牛影视| 美女一区二区在线观看| 日韩亚洲欧美高清| 久久av老司机精品网站导航| 日韩免费高清电影| 精品一区二区三区日韩| 2023国产精品视频| 精品一二线国产| 国产婷婷色一区二区三区四区| 国产黄色精品网站| 中文字幕在线免费不卡| 色老头久久综合| 亚洲午夜私人影院| 亚洲精品一区在线观看| 一本久久a久久免费精品不卡|