📄 disk.cpp
字号:
strError->Format("根目录中不能删除文件");
return FALSE;
}
if(1==nCount)
{
list=Rootlist[load[0]]; //得到目录信息
}
else
{
file.Seek(LtoP(load[nCount-1]),CFile::begin);
file.Read(&list,sizeof(List)); //得到目录信息
}
if(2>=byinfo[list.start]) //如果目录为空
{
strError->Format("目录为空");
return FALSE;
}
byte BIndex=list.start; //保存当前起始地址,即他下一层的父地址
List Nextlist; //保存他下一个目录;
file.Seek(LtoP(list.start),CFile::begin);
file.Read(&Nextlist,sizeof(List)); //读取第一个子目录信息;
if(Nextlist.name[0]==name[0]&&Nextlist.name[1]==name[1]&&Nextlist.name[2]==name[2]&&Nextlist.postfix==name[4])
//如果是删除此目录,即第一个目录
{
if(3==Nextlist.type) //如果是文件类型
{
nextin=Nextlist.start;
for(;nextin>2&&nextin<=128;) //将分配给他的内容地址标为未用
{
in=byinfo[nextin];
byinfo[nextin]=0;
nextin=in;
}
if(2<byinfo[BIndex]&&byinfo[BIndex]<=128) //如果有兄弟目录
{
BIndex=byinfo[BIndex]; //BIndex存储其兄弟目录的地址
file.Seek(LtoP(BIndex),CFile::begin);
file.Read(&Nextlist,sizeof(List));
file.Seek(LtoP(list.start),CFile::begin);
file.Write(&Nextlist,sizeof(List)); //将其兄弟目录移动到目录起始地址
byinfo[list.start]=byinfo[BIndex]; //修改分配表,将其兄弟指向的下一
byinfo[BIndex]=0; //个地址附给起目录指向的下一个地址.
}
else //没有兄弟目录
{
byinfo[list.start]=0; //清空目录
if(2==list.type) //如果是子目录,不是盘号
{
list.start=0; //将目录起始地址清空,表没子目录
file.Seek(LtoP(load[nCount-1]),CFile::begin);
file.Write(&list,sizeof(List)); //得到目录信息
}
}
file.SeekToBegin();
file.Write(&byinfo,sizeof(byte)*128); //修改文件
strError->Format("成功删除%c%c%c.%c",name[0],name[1],name[2],name[4]);
return TRUE;
}
}
else //否则不是目录中的首目录
{
byte nextindex;
nextindex=byinfo[BIndex]; // 下一个兄弟目录的地址
while(2<nextindex&&nextindex<=128)
{
file.Seek(LtoP(nextindex),CFile::begin);
file.Read(&Nextlist,sizeof(List));
if(3==Nextlist.type)//如果是文件类型
{
if(Nextlist.name[0]==name[0]&&Nextlist.name[1]==name[1]&&Nextlist.name[2]==name[2]&&Nextlist.postfix==name[4])
{
nextin=Nextlist.start;
for(;nextin>2&&nextin<=128;) //将分配给他的内容地址标为未用
{
in=byinfo[nextin];
byinfo[nextin]=0;
nextin=in;
}
byinfo[BIndex]=byinfo[nextindex];
byinfo[nextindex]=0; //更改分配表信息
file.SeekToBegin();
file.Write(&byinfo,sizeof(byte)*128); //修改文件
strError->Format("成功删除%c%c%c.%c",name[0],name[1],name[2],name[4]);
return TRUE;
}
}
BIndex=nextindex;
nextindex=byinfo[nextindex];
}
}
strError->Format("没有找到文件:%c%c%c.%c",name[0],name[1],name[2],name[4]);
return FALSE;
}
bool CDisk::Rdir(char name[3],CString * strError) //删除空目录
{
int nCount=load.GetSize(); //得到当前路径层数
if(0==nCount)
{
strError->Format("根目录中不能删除目录");
return FALSE;
}
if(1==nCount)
{
list=Rootlist[load[0]]; //得到目录信息
}
else
{
file.Seek(LtoP(load[nCount-1]),CFile::begin);
file.Read(&list,sizeof(List)); //得到目录信息
}
if(2>=byinfo[list.start]) //如果目录为空
{
strError->Format("目录为空");
return FALSE;
}
byte BIndex=list.start; //保存当前起始地址,即他下一层的父地址
List Nextlist; //保存他下一个目录;
file.Seek(LtoP(list.start),CFile::begin);
file.Read(&Nextlist,sizeof(List)); //读取第一个子目录信息;
if(Nextlist.name[0]==name[0]&&Nextlist.name[1]==name[1]&&Nextlist.name[2]==name[2])
//如果是删除此目录,即第一个目录
{
if(2==Nextlist.type) //如果是目录类型
{
if(0!=Nextlist.start) //如果不是空目录
{
strError->Format("%c%c%c不是空目录,不能删除",name[0],name[1],name[2]);
return FALSE;
}
if(2<byinfo[BIndex]&&byinfo[BIndex]<=128) //如果有兄弟目录
{
BIndex=byinfo[BIndex]; //BIndex存储其兄弟目录的地址
file.Seek(LtoP(BIndex),CFile::begin);
file.Read(&Nextlist,sizeof(List));
file.Seek(LtoP(list.start),CFile::begin);
file.Write(&Nextlist,sizeof(List)); //将其兄弟目录移动到目录起始地址
byinfo[list.start]=byinfo[BIndex]; //修改分配表,将其兄弟指向的下一
byinfo[BIndex]=0; //个地址附给起目录指向的下一个地址.
}
else //没有兄弟目录
{
byinfo[list.start]=0; //清空目录
if(2==list.type) //如果是子目录,不是盘号
{
list.start=0; //将目录起始地址清空,表没子目录
file.Seek(LtoP(load[nCount-1]),CFile::begin);
file.Write(&list,sizeof(List)); //得到目录信息
}
}
file.SeekToBegin();
file.Write(&byinfo,sizeof(byte)*128); //修改文件
strError->Format("成功删除%c%c%c",name[0],name[1],name[2]);
return TRUE;
}
}
else //否则不是目录中的首目录
{
byte nextindex;
nextindex=byinfo[BIndex]; // 下一个兄弟目录的地址
while(2<nextindex&&nextindex<=128)
{
file.Seek(LtoP(nextindex),CFile::begin);
file.Read(&Nextlist,sizeof(List));
if(2==Nextlist.type)//如果是文件类型
{
if(0!=Nextlist.start) //如果不是空目录
{
strError->Format("%c%c%c不是空目录,不能删除",name[0],name[1],name[2]);
return FALSE;
}
if(Nextlist.name[0]==name[0]&&Nextlist.name[1]==name[1]&&Nextlist.name[2]==name[2])
{
byinfo[BIndex]=byinfo[nextindex];
byinfo[nextindex]=0; //更改分配表信息
file.SeekToBegin();
file.Write(&byinfo,sizeof(byte)*128); //修改文件
strError->Format("成功删除%c%c%c",name[0],name[1],name[2]);
return TRUE;
}
}
BIndex=nextindex;
nextindex=byinfo[nextindex];
}
}
strError->Format("没有找到目录:%c%c%c",name[0],name[1],name[2]);
return FALSE;
}
bool CDisk::Deldir(byte index,CString *strError) //删除非空或空目录的递归函数
{
if(2>=index||index>128) // 如果为无效地址
return TRUE;
if(byinfo[index]<=2) //如果该地址没有用
return TRUE;
List newlist;
file.Seek(LtoP(index),CFile::begin);
file.Read(&newlist,sizeof(List));
if(byinfo[index]<=128 && byinfo[index]>2) //有兄弟目录
{
Deldir(byinfo[index],strError); //先删除他兄弟目录
}
if(2==newlist.type) //如果此为目录文件
{
Deldir(newlist.start,strError); //删除其子目录
}
byinfo[index]=0; //删除自己
byte nextin,in;
if(3==newlist.type) //如果为文件
{
nextin=newlist.start;
for(;nextin>2&&nextin<=128;) //将分配给他的内容地址标为未用
{
in=byinfo[nextin];
byinfo[nextin]=0;
nextin=in;
}
}
return TRUE;
}
bool CDisk::Deldir(char name[3],CString * strError) //删除非空或空目录
{
if(!CD(name,strError)) //进入该目录,删除他所有子目录。
{
strError->Format("没有 %c%c%c 文件夹",name[0],name[1],name[2]);
return FALSE;
}
int nCount=load.GetSize();
byte index=load[nCount-1];
List newlist;
file.Seek(LtoP(index),CFile::begin);
file.Read(&newlist,sizeof(List));
Deldir(newlist.start,strError); // 删除其子目录
newlist.start=0;
file.Seek(LtoP(index),CFile::begin);
file.Write(&newlist,sizeof(List));
CD(".. ",strError); //退出该目录;
if(!Rdir(name,strError)) //删除该目录
return FALSE;
return TRUE;
}
bool CDisk::Type(char name[6],CString str,CString * strError) //显示文件
{
int nCount=load.GetSize(); //得到路径的长度
if(0==nCount) //在根目录下
{
strError->Format("不能找到%c%c%c%c%c文件",name[0],name[1],name[2],name[3],name[4]);
return FALSE;
}
BYTE index;
if(1==nCount) //
{
list=Rootlist[load[0]];
index=list.start;
}
else
{
file.Seek(LtoP(load[nCount-1]),CFile::begin);
file.Read(&list,sizeof(List));
index=list.start; //得到该目录的开始位置
}
if(2<index)
{
for(;byinfo[index]>2;)
{
file.Seek(LtoP(index),CFile::begin);
file.Read(&list,sizeof(List));
if(3==list.type)
{
if(list.name[0]==name[0]&&list.name[1]==name[1]&&list.name[2]==name[2]&&list.postfix==name[4])
{
byte nextin;
char ch[65]={0};
file.Seek(LtoP(list.start),CFile::begin);
file.Read(ch,64);
tydlg.m_str=ch;
nextin=byinfo[list.start];
for(;nextin>2&&nextin<=128;)
{
file.Seek(LtoP(nextin),CFile::begin);
file.Read(ch,64);
tydlg.m_str+=ch;
nextin=byinfo[nextin];
}
str=tydlg.m_str;
*strError="";
tydlg.DoModal();
return TRUE;
}
}
index=byinfo[index];
if(index>128||index<=2)
break;
}
} //
strError->Format("不能找到%c%c%c%c%c文件",name[0],name[1],name[2],name[3],name[4]);
return TRUE;
}
bool CDisk::Edit(char name[6],CString * strError) //编辑文件
{
int nCount=load.GetSize(); //得到路径的长度
if(0==nCount) //在根目录下
{
strError->Format("不能找到%c%c%c%c%c文件",name[0],name[1],name[2],name[3],name[4]);
return FALSE;
}
BYTE index;
if(1==nCount) //
{
list=Rootlist[load[0]];
index=list.start;
}
else
{
file.Seek(LtoP(load[nCount-1]),CFile::begin);
file.Read(&list,sizeof(List));
index=list.start; //得到该目录的开始位置
}
if(2<index)
{
for(;byinfo[index]>2;)
{
file.Seek(LtoP(index),CFile::begin);
file.Read(&list,sizeof(List));
if(3==list.type)
{
if(list.name[0]==name[0]&&list.name[1]==name[1]&&list.name[2]==name[2]&&list.postfix==name[4])
{
byte nextin,in;
char ch[65]={0};
file.Seek(LtoP(list.start),CFile::begin);
file.Read(ch,64);
eddlg.m_str=ch;
nextin=byinfo[list.start];
byinfo[list.start]=255;
for(;nextin>2&&nextin<=128;)
{
file.Seek(LtoP(nextin),CFile::begin);
file.Read(ch,64);
eddlg.m_str+=ch;
in=byinfo[nextin];
byinfo[nextin]=0;
nextin=in;
}
file.SeekToBegin();
file.Write(byinfo,sizeof(byte)*128);
CString old=eddlg.m_str;
*strError="";
if(IDOK!=eddlg.DoModal())
{
eddlg.m_str=old;
}
char *p;
int strlength=eddlg.m_str.GetLength();
int time=(strlength-1)/64; //是大于64个字节多少倍
int Ladd[3]={0};
if(time>0)
{
if(!Seekroom(Rootlist[load.GetAt(0)].name[0],Ladd,time))
{
strError->Format("没有足够的空间,修改失败");
return FALSE;
}
}
file.Seek(LtoP(list.start),CFile::begin);
p=eddlg.m_str.GetBuffer(64);
file.Write(p,64);
for(int j=0;j<time;j++)
{
if(0==j)
byinfo[list.start]=Ladd[0];
file.Seek(LtoP(Ladd[j]),CFile::begin);
eddlg.m_str.Delete(0,64);
if(j>0)
byinfo[Ladd[j-1]]=Ladd[j];
p=eddlg.m_str.GetBuffer(64);
file.Write(p,64);
}
if(j>0)
{
byinfo[Ladd[j-1]]=255;
file.SeekToBegin();
file.Write(byinfo,sizeof(byte)*128);
}
return TRUE;
}
}
index=byinfo[index];
if(index>128||index<=2)
break;
}
} //
strError->Format("不能找到%c%c%c%c%c文件",name[0],name[1],name[2],name[3],name[4]);
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -