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

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

?? filesystem.cpp

?? LINUX 設計一個簡單的二級文件系統
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
	}
	fseek(fd, 0, 0);
	fread(&sb, 1, sizeof(SuperBlock), fd);
	fseek(fd, BlockSize, 0);
	fread(this->AllUser, 4, sizeof(User), fd);

	int i;
	for (i=0; i<NHINO; i++) {
		hinode[i].iForw = NULL;
	}
	for (i=0; i<100; i++) {
		sys_ofile[i].f_count = 0;
		sys_ofile[i].f_inode = NULL;
		sys_ofile[i].uid = -1;
	}
}

void FileSystem::UnLoad() {
	std::string str;
	int i;
	INode* inode;
	for (i=0; i<this->LoginNum; i++) {
		str = this->LoginUser[i].user.usn;
		this->Logout(str.c_str());
	}
	for (i=0; i<NHINO; i++) {
		inode = hinode[i].iForw;
		while (NULL != inode) {
			this->IPut(inode);
			inode = inode->iForw;
		}
	}
	/*
	User usr;
	fseek(fd, BlockSize, 0);
	fread(&usr, 1, sizeof(User), fd);
	// ddddddddddd
	cout << usr.usn << endl;*/
	this->SaveSuperBlock();
	cout << "系統正常御載!" << endl;
}

void FileSystem::Format() {
	int i;
	FILE* fd = fopen(this->Disk_Name, "r+w+b");

	BMap map;
	for (int j=IBlockNum+2; j<1024; j+=50) {
		for (i=1; i<50; i++) {
			map.usemap[i] = 0;
			map.BAddr[i] = 1 + (j+i);
			map.FBNum = 49;
		}
		fseek(fd, j*BlockSize, 0);
		fwrite(&map, 1, sizeof(BMap), fd);
	}
	DInode dinode;
	dinode.mode = 0;
	dinode.no = 1;
	dinode.size = 0;
	dinode.type = 'e';
	for (i=0; i<IBlockNum*BlockSize/sizeof(DInode); i++) {
		fseek(fd, this->IN_Start+i*sizeof(DInode), 0);
		fwrite(&dinode, 1, sizeof(DInode), fd);
		dinode.no++;
	}
	char* name[4] = {"alvin", "vica", "kzk", "doy"};
	User user;
	Direct dir;
	dir.size = 0;
	dinode.size = 1;
	dinode.mode = 1;
	dinode.type = 'd'; 
	dinode.di_number = 1;
	for (i=0; i<4; i++) {
		dinode.addr[0] = IBlockNum + 2 + (i/49)*50 + i%49+1;
		dinode.no = i+1;
		fseek(fd, this->mapAddr(dinode.no), 0);
		fwrite(&dinode, 1, sizeof(DInode), fd);
		fseek(fd, this->Data_Start+(i+1)*BlockSize, 0);
		fwrite(&dir, 1, sizeof(Direct), fd);
		strcpy(user.usn, name[i]);
		strcpy(user.pwd, name[i]);
		user.Dino = i+1;
		fseek(fd, BlockSize+i*sizeof(User), 0);
		fwrite(&user, 1, sizeof(User), fd);
	}
	SuperBlock sb;
	sb.DBNum = DBlockNum/50 * (this->GroupSize-1);
	sb.IBNum = IBlockNum/50 * (this->GroupSize-1);
	sb.FBNum = 12*49-4;
	sb.FINum = IBlockNum*BlockSize/sizeof(DInode)-4;
	sb.pFB = 0;
	sb.pFI = 0;
	sb.SysMod = 0;
	fseek(fd, 0, 0);
	fwrite(&sb, 1, sizeof(SuperBlock), fd);
	fclose(fd);
}

int FileSystem::UNameI(const char *usn) {
	for (int i=0; i<this->LoginNum; i++) {
		if (strcmp(usn, this->LoginUser[i].user.usn) == 0) {
			return i;
		}
	}
	return -1;
}

unsigned int FileSystem::BAlloc() {
	if (sb.FBNum == 0) {
		cout << "磁盤以滿" << endl;
		return 0;
	}
	if (sb.pFB == 0) {
		int i, j;
		int count = 0;
		bool flag = 1;
		for (i=0; i<DBlockNum/this->GroupSize; i++) {
			BMap map;
			fseek(fd, this->Data_Start + BlockSize*this->GroupSize*i, 0);
			fread(&map, 1, sizeof(BMap), fd);
			for (j=0; j<(this->GroupSize-1); j++) {
				if (map.usemap[j] == 0) {
					map.usemap[j] = 1;
					sb.FBS[sb.pFB] = map.BAddr[j];
					sb.pFB++;
					map.FBNum--;
					count++;
					if (count == 50) {
						flag = 0;
						break;
					}
				}
			}
			fseek(fd, this->Data_Start + BlockSize*50*i, 0);
			fwrite(&map, 1, sizeof(BMap), fd);
			if (!flag) break;
		}
	}
	unsigned int free_block = sb.FBS[sb.pFB-1];
	sb.SysMod = 0;
	sb.FBNum--;
	sb.pFB--;
	this->SaveSuperBlock();
	return free_block;
}

void FileSystem::BFree(unsigned int block_num) {
	int i;
	int g, of;
	unsigned int blk;
	BMap map;
	if (sb.pFB == 100) { // 棧滿
		for (i=0; i<50; i++) {
			blk = sb.FBS[sb.pFB-1];
			sb.pFB--;
			g = (blk-2) / 50;
			of = (blk-2) % 50;
			fseek(fd, BlockSize*blk, 0);
			fread(&map, 1, sizeof(BMap), fd);
			map.FBNum++;
			map.usemap[of-1] = 0;
			fwrite(&map, 1, sizeof(BMap), fd);
		}
	}
	sb.FBS[sb.pFB] = block_num;
	sb.pFB++;
	sb.FBNum++;
	sb.SysMod = 0;
	this->SaveSuperBlock();
}

int FileSystem::Open(const char *usn, const char *name) {
	if (!this->CheckLogin(usn)) return -1;

	INode* inode;
	int i;
	unsigned int dinodeid = this->NameI(usn, name);

	if (dinodeid == 0) {
		cout << "文件不存在!" << endl;
		return -1;
	}

	inode = this->IGet(dinodeid);
	for (i=0; i<100; i++) {
		if (sys_ofile[i].f_count == 0) break;
	}
	if (i == 100) {
		cout << "系統當前打開太多文件,請稍后再試!" << endl;
		return -1;
	}
	sys_ofile[i].f_inode = inode;
	sys_ofile[i].f_count = 1;
	sys_ofile[i].uid = this->UNameI(usn);

	return i;
}

int FileSystem::CheckUserFile(const char *usn, int file) {
	if (file<0 || file>99 || sys_ofile[file].f_count < 1) {
		cout << "文件沒有被打開!" << endl;
		return 0;
	}
	int uid = this->UNameI(usn);
	if (sys_ofile[file].uid != uid) {
		cout << "文件正被其它用戶打開!" << endl;
		return 0;
	}
	return 1;
}

void FileSystem::Close(const char *usn, const int file) {
	if (!this->CheckLogin(usn)) return;
	if (!this->CheckUserFile(usn, file)) return;
	sys_ofile[file].f_count = 0;
}

void FileSystem::Write(const char *usn, int file, const char *content) {
	if (!this->CheckLogin(usn)) return;
	if (!this->CheckUserFile(usn, file)) return;
	INode* inode = sys_ofile[file].f_inode;
	inode = this->IGet(inode->Dino);
	std::string str = content;
	int length = str.length();
	char* buf = (char*)malloc(sizeof(char)*length + BlockSize);
	int bNum = length / BlockSize;
	int MR = length%BlockSize;
	if (MR!=0) bNum++;
	unsigned bAddr;

	int i;
	for (i=0; i<inode->size; i++) {
		this->BFree(inode->addr[i]);
	}
	inode->size = bNum;
	for (i=0; i<bNum; i++) {
		bAddr = this->BAlloc();
		inode->addr[i] = bAddr;
		if (bAddr != 0) {
			fseek(fd, bAddr*BlockSize, 0);
			fwrite(content+i*BlockSize, 1, BlockSize, fd);
		}
	}
	this->IPut(inode);
}

std::string FileSystem::Read(const char *usn, int file) {
	std::string str;
	if (!this->CheckLogin(usn)) {
		str = "";
		return str;
	}
	if (!this->CheckUserFile(usn, file)) {
		str = "";
		return str;
	}
	INode* inode = sys_ofile[file].f_inode;
	inode = this->IGet(inode->Dino);
	char* buf;
	if (inode->size < 1) {
		str = "";
	} else {
		buf = (char*)malloc(sizeof(char)*BlockSize*inode->size);
		for (int i=0; i<inode->size; i++) {
			fseek(fd, inode->addr[i]*BlockSize, 0);
			fread(buf+BlockSize*i, 1, BlockSize, fd);
		}
		str = buf;
		free(buf);
	}
	this->IPut(inode);
	return str;
}

void FileSystem::DeleteFile(const char *usn, const char *name) {
	if (!this->CheckLogin(usn)) return;
	int i;
	unsigned int dinodeid = this->NameI(usn, name);
	if (dinodeid == 0) {
		cout << "文件不存在!" << endl;
		return;
	}
	INode* inode = this->IGet(dinodeid);
	if (inode->type != 'f') {
		this->IPut(inode);
		cout << "文件不存在!" << endl;
		return;
	}
	this->IPut(inode);

	for (i=0; i<100; i++) {
		if (sys_ofile[i].f_count>0 && sys_ofile[i].f_inode->Dino == dinodeid) {
			cout << "文件正被打開,不能刪除!" << endl;
			return;
		}
	}
	unsigned int curDir = this->LoginUser[this->UNameI(usn)].CurDirInodeID;
	inode = this->IGet(curDir);
	Direct dir;
	fseek(fd, inode->addr[0]*BlockSize, 0);
	fread(&dir, 1, sizeof(Direct), fd);
	for (i=0; i<dir.size; i++) {
		if (dir.files[i].Dino == dinodeid) {
			dir.size--;
			dir.files[i] = dir.files[dir.size];
			break;
		}
	}
	fseek(fd, inode->addr[0]*BlockSize, 0);
	fwrite(&dir, 1, sizeof(Direct), fd);
	this->IPut(inode);

	inode = this->IGet(dinodeid);
	for (i=0; i<inode->size; i++) {
		this->BFree(inode->addr[i]);
	}
	this->IPut(inode);
	this->IFree(dinodeid);

	cout << "文件刪除成功!" << endl;
}

void FileSystem::DeleteFolder(const char *usn, const char *name) {
	if (!this->CheckLogin(usn)) return;
	if (0 == strcmp("/", name)) return;
	unsigned int dinodeid = this->NameI(usn, name);
	if (dinodeid == 0) {
		cout << "文件夾不存在!" << endl;
		return;
	}
	INode* inode = this->IGet(dinodeid);
	if (inode->type != 'd') {
		this->IPut(inode);
		cout << "文件夾不存在!" << endl;
		return;
	}
	this->IPut(inode);

	unsigned int curDir = this->LoginUser[this->UNameI(usn)].CurDirInodeID;
	inode = this->IGet(curDir);
	Direct dir;
	fseek(fd, inode->addr[0]*BlockSize, 0);
	fread(&dir, 1, sizeof(Direct), fd);
	for (int i=0; i<dir.size; i++) {
		if (dir.files[i].Dino == dinodeid) {
			dir.size--;
			dir.files[i] = dir.files[dir.size];
			break;
		}
	}
	fseek(fd, inode->addr[0]*BlockSize, 0);
	fwrite(&dir, 1, sizeof(Direct), fd);
	this->IPut(inode);

	inode = this->IGet(dinodeid);
	fseek(fd, inode->addr[0]*BlockSize, 0);
	fread(&dir, 1, sizeof(Direct), fd);
	this->BFree(inode->addr[0]);
	this->IPut(inode);
	this->IFree(dinodeid);

	this->DeleteADir(dir);

	cout << "文件夾刪除成功!" << endl;
}


void FileSystem::DeleteADir(Direct dir) {
	INode *inode, *tinode;
	unsigned int dinodeid, dnid;
	Direct sdir;
	int j;
	for (int i=0; i<dir.size; i++) {
		dinodeid = dir.files[i].Dino;
		inode = this->IGet(dinodeid);
		if (inode->type == 'f') {
			for (j=0; j<inode->size; j++) {
				this->BFree(inode->addr[j]);
			}
			this->IPut(inode);
			this->IFree(dinodeid);
		} else if (inode->type == 'd') {
			if (strcmp("..", dir.files[i].name)!=0) {
				this->IPut(inode);
				this->IFree(dinodeid);
				dnid = dir.files[i].Dino;
				tinode = this->IGet(dnid);
				fseek(fd, tinode->addr[0]*BlockSize, 0);
				fread(&sdir, 1, sizeof(Direct), fd);
				this->BFree(tinode->addr[0]);
				this->IPut(tinode);
				this->IFree(dnid);
				this->DeleteADir(sdir);
			} else {
				this->IPut(inode);
				this->IFree(dinodeid);
			}
		}
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品中文欧美| 亚洲国产成人av好男人在线观看| 久久精品人人做人人爽97| 中文无字幕一区二区三区| 成人久久久精品乱码一区二区三区| 日本精品一区二区三区四区的功能| 91麻豆精品国产| 日韩精品亚洲一区| 精品久久人人做人人爱| 一区二区免费视频| 国产成人一区在线| 国产精品国产三级国产aⅴ入口| 蜜臀精品久久久久久蜜臀| 精品欧美一区二区久久| 成人欧美一区二区三区白人| 亚洲影院久久精品| 911精品国产一区二区在线| 蜜臀久久99精品久久久画质超高清| 2023国产精华国产精品| aaa欧美色吧激情视频| 久久免费视频一区| 9人人澡人人爽人人精品| 一区二区国产盗摄色噜噜| 成人午夜精品一区二区三区| 日韩伦理av电影| av一区二区不卡| 亚洲一区二区三区四区在线| caoporn国产一区二区| 久久综合狠狠综合久久激情| 日韩黄色免费电影| 国产亚洲综合av| 国产乱子轮精品视频| 国产精品久久久久久久久晋中 | 中文字幕免费一区| 欧美挠脚心视频网站| 国产高清视频一区| 久久久久高清精品| 欧美私模裸体表演在线观看| 一区二区久久久久久| 一本到一区二区三区| 日本成人在线电影网| 国产精品国产a| 91蜜桃视频在线| 亚洲欧美日韩综合aⅴ视频| 91丨porny丨最新| 精彩视频一区二区三区| 亚洲国产人成综合网站| 中文一区一区三区高中清不卡| 欧美日本在线看| 日本久久电影网| 国产不卡免费视频| 免费看日韩精品| 久久久不卡影院| 欧美日本一区二区在线观看| 美女尤物国产一区| 久久久久久久久久久99999| 欧美日韩免费一区二区三区视频| 欧美精品欧美精品系列| 国产不卡一区视频| 一区二区三区免费观看| 337p日本欧洲亚洲大胆精品| 国产999精品久久久久久| 亚洲欧美中日韩| 欧美丝袜丝交足nylons| 91色porny蝌蚪| 图片区小说区区亚洲影院| 欧美一区二区三区视频免费播放| 99精品久久久久久| 日本成人在线电影网| 午夜久久福利影院| 久久久噜噜噜久久人人看| 97se亚洲国产综合自在线观| 日韩中文字幕1| 国产日韩精品一区二区三区| 精品1区2区在线观看| 日韩一级免费一区| 日韩午夜激情av| 91精品黄色片免费大全| 欧美一级片在线看| 99久久精品免费| 94-欧美-setu| 色94色欧美sute亚洲线路一久 | 亚洲欧美另类久久久精品2019| 国产欧美精品日韩区二区麻豆天美| 99精品国产热久久91蜜凸| 成人永久看片免费视频天堂| 亚洲一区二区三区在线看| 亚洲午夜免费福利视频| 午夜一区二区三区视频| 日韩1区2区日韩1区2区| 亚洲日本乱码在线观看| 精品国内二区三区| 久久免费视频色| 欧美伦理视频网站| 日韩一区二区三区在线| 91浏览器在线视频| 欧美性生活久久| 69成人精品免费视频| 99国产精品一区| 欧美视频一区二区三区在线观看| 欧美久久一二区| 99麻豆久久久国产精品免费优播| 99国产精品国产精品毛片| 精品视频1区2区3区| 欧美一级xxx| 欧美剧在线免费观看网站 | 欧美日韩一区二区在线观看| 欧美猛男gaygay网站| 欧美成人乱码一区二区三区| 久久久99精品免费观看| 亚洲视频图片小说| 国产精品久久三区| 久久综合九色综合97婷婷女人 | 成人国产精品免费观看| 在线精品视频免费播放| 99久久伊人网影院| 懂色av中文字幕一区二区三区| 91一区二区三区在线观看| 欧美日韩国产欧美日美国产精品| 久久丝袜美腿综合| 久久亚洲精品国产精品紫薇| 中文字幕在线观看不卡| 日韩精品一二三| 日韩av一级片| 热久久一区二区| 天天操天天色综合| 日韩成人av影视| 北条麻妃一区二区三区| 欧美一级理论性理论a| 亚洲女与黑人做爰| 亚洲激情中文1区| 国产中文字幕一区| 欧美日韩国产美女| 亚洲精品少妇30p| 亚洲国产一区二区视频| 国产成人无遮挡在线视频| 欧美日韩国产精选| 日韩精品中午字幕| 亚洲成人手机在线| 91在线视频在线| 26uuuu精品一区二区| 国产欧美一二三区| 综合自拍亚洲综合图不卡区| 亚洲免费观看高清| 国产一二三精品| 99久久综合国产精品| 欧美日韩综合在线| 日韩欧美国产1| 亚洲成人综合在线| 色婷婷精品大在线视频| 国产精品久久久久四虎| 国产精品99久久久久久久vr| 99精品国产一区二区三区不卡| 欧美私人免费视频| 精品国产sm最大网站免费看| 国产喷白浆一区二区三区| 麻豆中文一区二区| 欧美丰满高潮xxxx喷水动漫| 亚洲不卡av一区二区三区| 欧美吞精做爰啪啪高潮| 亚洲综合免费观看高清在线观看| 91美女蜜桃在线| 91精品国产黑色紧身裤美女| 亚洲一二三区在线观看| 国内成+人亚洲+欧美+综合在线| 日韩欧美一区二区免费| 免费观看日韩av| 色综合咪咪久久| 亚洲欧美激情插| 经典三级在线一区| 精品国产一区二区三区忘忧草| 久久99精品国产麻豆婷婷| 成人av免费网站| 69成人精品免费视频| 中文字幕高清不卡| 日韩国产精品91| 91在线观看下载| 亚洲精品国产成人久久av盗摄| 色婷婷综合在线| 日韩福利视频网| 97久久精品人人爽人人爽蜜臀| 亚洲欧洲一区二区三区| 理论片日本一区| 久久久久久久久久久久电影| 高清不卡一区二区| 日韩视频一区二区在线观看| 中文字幕一区二区三区蜜月 | 国产成人av福利| 国产精品美女久久久久aⅴ国产馆| 亚洲成人福利片| 日韩欧美色综合| 亚洲国产综合视频在线观看| 欧美一区二区不卡视频| 一区二区免费看| 日韩亚洲欧美一区| 丝袜美腿亚洲一区| 26uuu精品一区二区在线观看| 日韩1区2区3区| 国产婷婷色一区二区三区 | 欧美美女直播网站|