⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 folder.cpp

📁 模拟Linux文件系统 在任一OS下
💻 CPP
字号:
#include"disk.h"
extern disk DISK;
folder::folder(fstream i,inode ite){
	iof=i;
	folderinode=ite;
}
void folder::folder_makedir(){
	//	int s=ftemp.folder_applyfor();
	folderitem fitemp;
	strcpy(fitemp.filename,".");
	fitemp.inodenum=folderinode.inode_num;
	folder_write(0,&fitemp);
	
//	s=ftemp.folder_applyfor();
	strcpy(fitemp.filename,"..");
	fitemp.inodenum=-1;
	folder_write(1,&fitemp);
	folder_inodewriteback();
}
void folder::folder_open(fstream i,inode ite){
	iof=i;
	folderinode=ite;
}
int folder::folder_location(int sit){
	int k=sit/28;
	int j=sit%28;
	if(folderinode.address[k]!=-1){
		DISK.block_to_buffer(folderinode.address[k],j*sizeof(folderitem));
		return 1;
	}
	else return -1;
}
void folder::folder_read(int sit,folderitem*t){
	folder_location(sit);
	iof.read((char*)t,sizeof(folderitem));
}
void folder::folder_browse(){
	folderitem fitemp;
	folder_read(folderinode.extend3,&fitemp);
	for(int i=fitemp.next;i!=-1;){
		cout<<"filename:"<<fitemp.filename<<endl;
		folder_read(i,&fitemp);
		i=fitemp.next;
	}
	cout<<"filename:"<<fitemp.filename<<endl;
}
int folder::folder_findbyname(char*name){
	folderitem fitemp;
	folder_read(folderinode.extend3,&fitemp);
	for(int i=0;i!=-1;){
		if(strcmp(fitemp.filename,name)==0)
			return i;
		i=fitemp.next;
		folder_read(i,&fitemp);
	}
	return -1;
}
int folder::folder_applyfor(){
	folderitem fitemp;
	/*
	folder_read(folderinode.extend3,&fitemp);
	for(int i=0;i!=-1;i++){
		if(fitemp.next==0)
			return i;
		i=fitemp.next;
		folder_read(i,&fitemp);
	}
	return -1;
	*/
	folderinode.file_size++;
	for(int i=0;i<280;){
		if(folder_location(i)==1){
			folder_read(i,&fitemp);
			if(fitemp.folderitem_judge()!=1)
				return i;
			i++;
		}
		else i=i+28;
	}
	for(i=0;i<10;i++){
		if(folderinode.address[i]!=-1){
			freebitmap fb(iof);
			int k=fb.freebitmap_applyfor();
			folderinode.address[i]=k;
			return i*28;
		}
	}
	cout<<"there is no enough free space in folder"<<endl;
	folderinode.file_size--;
	return -1;
}
void folder::folder_write(int sit,folderitem*t){
/*	if(folderinode==2&&folderinode.extend3==0&&folderinode.extend4==0)
		folderinode.extend3=0;*/
	(*t).next=-1;
	(*t).before=folderinode.extend4;
	folder_location(folderinode.extend4);
    folderitem ft;
    iof.read((char*)&ft,sizeof(folderitem));
	ft.next=sit;
	folder_location(folderinode.extend4);
	iof.write((char*)&ft,sizeof(folderitem));
	folderinode.extend4=sit;
	folder_location(sit);
	iof.write((char*)t,sizeof(folderitem));
	//folder_inodewriteback();
}
void folder::folder_write_nocondition(int sit,folderitem*t){
	folder_location(sit);
	iof.write((char*)t,sizeof(folderitem));
}
void folder::folder_inodewriteback(){
	inodelist_disk id(iof);
	id.inodelist_disk_write(folderinode.inode_num,folderinode);
}
void folder::folder_deleteitem(int sit){
	if(sit==0||sit==1){
		cout<<"wrong input"<<endl;
		exit(0);
	}
	folderitem fitemp;
	folder_read(sit,&fitemp);
	int b=fitemp.before;
	int n=fitemp.next;
	fitemp.folderitem_clear();
	folder_write_nocondition(sit,&fitemp);
	folder_read(b,&fitemp);
	fitemp.next=n;
	folder_write_nocondition(b,&fitemp);
	if(n!=-1){   //如果不是链表最后一项
		folder_read(n,&fitemp);
		fitemp.before=b;
		folder_write_nocondition(n,&fitemp);
	}
	else{
		folderinode.extend4=b;
		folder_inodewriteback();
	}
}
void folder::folder_deletebyname(char*name){
	int i=folder_findbyname(name);
	if(i!=-1)
		folder_deleteitem(i);
	else cout<<"there is no such a folderitem"<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -