?? 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 + -