📄 fs.cpp
字号:
{
AfxMessageBox("目录非空,删除失败!");
return;
}
CFile file;
if(file.Open("mydisk.txt",
CFile::modeReadWrite|CFile::shareExclusive)!=0)
{
int n=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemData(hItem);
char name[4];
CString tempname;
tempname=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemText(hItem);
name[0]=tempname.GetAt(0);
name[1]=tempname.GetAt(1);
name[2]=tempname.GetAt(2);
name[3]='\0';
file.Seek(n*64,CFile::begin);
char str[9];
for(int i=0;i<8;i++)
{
file.Read(str,8);
char str1[4];
str1[0]=str[0];
str1[1]=str[1];
str1[2]=str[2];
str1[3]='\0';
if(strcmp(str1,name)==0)
break;
}
int position=i;
fat[curdir.first]='0';
file.Seek(curdir.first,CFile::begin);
file.Write("0",1);
file.Seek(n*64+position*8,CFile::begin);
file.Write("||||||||",8);
file.Seek(curdir.first*64,CFile::begin);
file.Write("||||||||",8);
file.Close();
//画扇区
int radius=30;
radius=30+int(curdir.first/8)*8;
int begin,end;
begin=curdir.first%8;
end=curdir.first%8+1;
DrawCircle(radius,begin,end,0);
((COSDlg*)AfxGetMainWnd())->m_tree1.DeleteItem(hItem);
}else
{
AfxMessageBox("打开文件失败 2");
return ;
}
}
void CFS::CreatFile()
{
CFileCreatDlg dlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_edit1.GetLength()!=3)
{
AfxMessageBox("文件名为三个字符");
return ;
}
if(dlg.m_edit2.GetLength()!=2)
{
AfxMessageBox("扩展名为两个字符");
return ;
}
char fname[4],fext[3];
int filelength;
int charlength;
char temp[2]={'\0','\0'};
fname[0]=dlg.m_edit1.GetAt(0);
fname[1]=dlg.m_edit1.GetAt(1);
fname[2]=dlg.m_edit1.GetAt(2);
fname[3]='\0';
fext[0]=dlg.m_edit2.GetAt(0);
fext[1]=dlg.m_edit2.GetAt(1);
fext[3]='\0';
charlength=dlg.m_edit3.GetLength();
filelength=int(ceil(dlg.m_edit3.GetLength()/64.000000));
CFile file;
if(file.Open("mydisk.txt",
CFile::modeReadWrite|CFile::shareExclusive)!=0)
{
//position,目录项号
int position;
//sonfirst,起始盘块号
int subfirst;
for(int i=0;i<8;i++)
{
if(strcmp(subdirname[i],fname)==0)
{
AfxMessageBox("重名错误");
return;
}
}
for(i=0;i<8;i++)
{
if(strcmp(subdirname[i],"|||")==0)
break;
}
if(i==8)
{
AfxMessageBox("不能再创建文件或目录");
return;
}
//position,目录项号
position=i;
strcpy(subdirname[i],fname);
if(filelength!=0)
{
int blocknum;
blocknum=filelength;
int blocks[4];
int j=0;
for(i=3;i<128;i++)
{
if(fat[i]=='0')
{
blocks[j]=i;
j++;
}
if(j==blocknum)
break;
}
if(j!=blocknum)
{
AfxMessageBox("磁盘满");
return;
}
subfirst=blocks[0];
//写FAT数组及磁盘
for(i=0;i<blocknum-1;i++)
{
fat[blocks[i]]='0'+blocks[i+1];
}
fat[blocks[blocknum-1]]='*';
for(i=0;i<blocknum;i++)
{
file.Seek(blocks[i],CFile::begin);
temp[0]=fat[blocks[i]];
file.Write(temp,1);
}
//写目录项
file.Seek(curdir.first*64+position*8,CFile::begin);
file.Write(fname,3);
file.Write(fext,2);
temp[0]='1';
file.Write(temp,1);
temp[0]=subfirst+'0';
file.Write(temp,1);
temp[0]=filelength+'0';
file.Write(temp,1);
//画扇区
int radius=30;
for(i=0;i<blocknum;i++)
{
radius=30+int(blocks[i]/8)*8;
int begin,end;
begin=blocks[i]%8;
end=blocks[i]%8+1;
DrawCircle(radius,begin,end,1);
}
//写文件内容
char buf[65];
for(i=0;i<blocknum-1;i++)
{
for(int j=0;j<64;j++)
buf[j]=dlg.m_edit3.GetAt(i*64+j);
buf[64]='\0';
file.Seek(64*blocks[i],CFile::begin);
file.Write(buf,64);
}
int len=charlength%64;
for(i=0;i<len;i++)
buf[i]=dlg.m_edit3.GetAt((blocknum-1)*64+i);
buf[len]='*';
buf[len+1]='\0';
file.Seek(64*blocks[blocknum-1],CFile::begin);
file.Write(buf,len+1);
file.Close();
}else
{
//写目录项
file.Seek(curdir.first*64+position*8,CFile::begin);
file.Write(fname,3);
file.Write(fext,2);
temp[0]='1';
file.Write(temp,1);
temp[0]=0+'0';
file.Write(temp,1);
temp[0]=filelength+'0';
file.Write(temp,1);
file.Close();
}
//向目录树添加项目
HTREEITEM hItem,hItem0;
hItem=((COSDlg*)AfxGetMainWnd())->m_tree1.GetSelectedItem();
TVINSERTSTRUCT tvItem;
tvItem.hParent=hItem;
tvItem.hInsertAfter=TVI_LAST;
tvItem.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
tvItem.item.iImage=tvItem.item.iSelectedImage=2;
char str1[7];
strcpy(str1,fname);
strcat(str1,".");
strcat(str1,fext);
str1[6]='\0';
tvItem.item.pszText=str1;
hItem0=((COSDlg*)AfxGetMainWnd())->m_tree1.InsertItem(&tvItem);
((COSDlg*)AfxGetMainWnd())->m_tree1.SetItemData(hItem0,curdir.first);
((COSDlg*)AfxGetMainWnd())->m_tree1.Expand(hItem,TVE_EXPAND);
}else
{
AfxMessageBox("打开文件失败 3");
return;
}
}
}
void CFS::DeleteFile()
{
HTREEITEM hItem;
hItem=((COSDlg*)AfxGetMainWnd())->m_tree1.GetSelectedItem();
CFile file;
if(file.Open("mydisk.txt",
CFile::modeReadWrite|CFile::shareExclusive)!=0)
{
int n=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemData(hItem);
char name[4];
CString tempname;
tempname=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemText(hItem);
name[0]=tempname.GetAt(0);
name[1]=tempname.GetAt(1);
name[2]=tempname.GetAt(2);
name[3]='\0';
file.Seek(n*64,CFile::begin);
char str[9];
for(int i=0;i<8;i++)
{
file.Read(str,8);
char str1[4];
str1[0]=str[0];
str1[1]=str[1];
str1[2]=str[2];
str1[3]='\0';
if(strcmp(str1,name)==0)
break;
}
int position=i;
if(curdir.length==0)
{
file.Seek(n*64+position*8,CFile::begin);
file.Write("||||||||",8);
file.Close();
((COSDlg*)AfxGetMainWnd())->m_tree1.DeleteItem(hItem);
}else
{
int blocks[4];
char temp[2]={'\0','\0'};
temp[0]=curdir.first+'0';
int i=0;
do
{
blocks[i]=temp[0]-'0';
file.Seek(blocks[i],CFile::begin);
file.Read(temp,1);
i++;
}while(temp[0]!='*');//也可使用curdir.length和for循环
int blocknum=i;
//覆盖目录项,该项要先做
file.Seek(n*64+position*8,CFile::begin);
file.Write("||||||||",8);
//写FAT数组和FAT磁盘
for(i=0;i<blocknum;i++)
{
fat[blocks[i]]='0';
file.Seek(blocks[i],CFile::begin);
file.Write("0",1);
}
//释放磁盘扇区
char buf[65];
for(i=0;i<64;i++)
buf[i]='|';
buf[64]='\0';
for(i=0;i<blocknum;i++)
{
file.Seek(64*blocks[i],CFile::begin);
file.Write(buf,64);
}
file.Close();
//画扇区
int radius=30;
int begin,end;
for(i=0;i<blocknum;i++)
{
radius=30+int(blocks[i]/8)*8;
begin=blocks[i]%8;
end=blocks[i]%8+1;
DrawCircle(radius,begin,end,0);
}
((COSDlg*)AfxGetMainWnd())->m_tree1.DeleteItem(hItem);
}
}else
{
AfxMessageBox("打开文件失败 4");
return ;
}
}
void CFS::TypeFile()
{
HTREEITEM hItem;
hItem=((COSDlg*)AfxGetMainWnd())->m_tree1.GetSelectedItem();
CFile file;
if(file.Open("mydisk.txt",
CFile::modeReadWrite|CFile::shareExclusive)!=0)
{
int n=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemData(hItem);
char name[4];
CString tempname;
tempname=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemText(hItem);
name[0]=tempname.GetAt(0);
name[1]=tempname.GetAt(1);
name[2]=tempname.GetAt(2);
name[3]='\0';
file.Seek(n*64,CFile::begin);
char str[9];
for(int i=0;i<8;i++)
{
file.Read(str,8);
char str1[4];
str1[0]=str[0];
str1[1]=str[1];
str1[2]=str[2];
str1[3]='\0';
if(strcmp(str1,name)==0)
break;
}
int position=i;
if(curdir.length==0)
{
AfxMessageBox("文件现在为空");
return;
}else
{
int blocks[4];
char temp[2]={'\0','\0'};
temp[0]=curdir.first+'0';
int i=0;
do
{
blocks[i]=temp[0]-'0';
file.Seek(blocks[i],CFile::begin);
file.Read(temp,1);
i++;
}while(temp[0]!='*');//也可使用curdir.length和for循环
int blocknum=i;
char buf[65];
CString content,add;
content="";
for(i=0;i<blocknum-1;i++)
{
file.Seek(64*blocks[i],CFile::begin);
file.Read(buf,64);
buf[64]='\0';
add.Empty();
add.Format("%s",buf);
content+=add;
}
file.Seek(64*blocks[blocknum-1],CFile::begin);
for(i=0;i<64;i++)
{
file.Read(temp,1);
if(temp[0]=='*')
break;
buf[i]=temp[0];
}
buf[i]='\0';
add.Empty();
add.Format("%s",buf);
content+=add;
CFileType dlg;
dlg.m_edit1=content;
dlg.DoModal();
file.Close();
}
}
}
bool CFS::ReadCommandFile(CString &name, CString **command, int &num)
{
HTREEITEM hItem;
hItem=((COSDlg*)AfxGetMainWnd())->m_tree1.GetSelectedItem();
CFile file;
if(file.Open("mydisk.txt",
CFile::modeReadWrite|CFile::shareExclusive)!=0)
{
int n=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemData(hItem);
char fname[4];
char fext[3];
CString tempname;
tempname=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemText(hItem);
fname[0]=tempname.GetAt(0);
fname[1]=tempname.GetAt(1);
fname[2]=tempname.GetAt(2);
fname[3]='\0';
file.Seek(n*64,CFile::begin);
char str[9];
for(int i=0;i<8;i++)
{
file.Read(str,8);
char str1[4];
str1[0]=str[0];
str1[1]=str[1];
str1[2]=str[2];
str1[3]='\0';
if(strcmp(str1,fname)==0)
break;
}
int position=i;
fext[0]=str[3];
fext[1]=str[4];
fext[2]='\0';
if(strcmp(fext,"ex")!=0&&strcmp(fext,"EX")!=0)
{
AfxMessageBox("请添加扩展名为\".ex\"的文件");
return 0;
}
if(curdir.length==0)
{
AfxMessageBox("文件现在为空");
return 0;
}else
{
int blocks[4];
char temp[2]={'\0','\0'};
temp[0]=curdir.first+'0';
int i=0;
do
{
blocks[i]=temp[0]-'0';
file.Seek(blocks[i],CFile::begin);
file.Read(temp,1);
i++;
}while(temp[0]!='*');//也可使用curdir.length和for循环
int blocknum=i;
char buf[65];
CString content,add;
content="";
for(i=0;i<blocknum-1;i++)
{
file.Seek(64*blocks[i],CFile::begin);
file.Read(buf,64);
buf[64]='\0';
add.Empty();
add.Format("%s",buf);
content+=add;
}
file.Seek(64*blocks[blocknum-1],CFile::begin);
for(i=0;i<64;i++)
{
file.Read(temp,1);
if(temp[0]=='*')
break;
buf[i]=temp[0];
}
buf[i]='\0';
add.Empty();
add.Format("%s",buf);
content+=add;
file.Close();
name.Format("%s",fname);
*command=new CString[50];
int charlength=content.GetLength();
int j=-1;
int flag=1;
do{
j++;
if(j*4+3>charlength)
{
flag=0;
break;
}
(*command)[j].Format("%c%c%c%c",
content.GetAt(j*4+0),content.GetAt(j*4+1),
content.GetAt(j*4+2),content.GetAt(j*4+3));
(*command)[j].MakeLower();
if((*command)[j].GetAt(3)!=';')
{
flag=0;
break;
}
}while((*command)[j]!="end;");
num=j;
if((*command)[j]!="end;")
flag=0;
if(flag==0)
{
// delete []command;
AfxMessageBox("命令文件有误,请检查\n 或仔细阅读帮助");
return 0;
}
if(j>0)
return 1;
else return 0;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -