📄 folder.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 + -