?? disk.cpp
字號:
// Disk.cpp: implementation of the CDisk class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "os.h"
#include "Disk.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDisk::CDisk()
{
if(0==file.Open("file.txt",CFile::modeReadWrite ,NULL))
{
file.Open("file.txt",CFile::modeCreate,NULL);
file.Close();
file.Open("file.txt",CFile::modeReadWrite ,NULL);
file.SetLength(64*128);
}
else
{
file.SeekToBegin();
file.Read(&byinfo,sizeof(byte)*128);
file.Read(Rootlist,sizeof(List)*8);
byRootnum=byinfo[2];
}
load.RemoveAll();
}
CDisk::~CDisk()
{
file.Close();
}
int CDisk::LtoP(byte L_address) //邏輯地址轉換成物理地址
{
return L_address*64;
}
bool CDisk::Fdisk(int num,char name[8],int big[8]) //初始化模擬硬盤
{
int i,all;
all=0;
for(i=0;i<num-1;i++){
all+=big[i];
}
big[num-1]=125-all; //計算最后一個盤的大小
if(num>8||big[num-1]<1)
return FALSE;
file.SetLength(0); //清除文件內容
file.SetLength(128*64); //設置文件的長度
byinfo[0]=byinfo[1]=1; //硬盤起始三個區用為系統管理
byinfo[2]=num; //存根目錄數
byRootnum=num; //存根目錄數
for(i=3;i<128;i++){ //初始化磁盤分配表
byinfo[i]=0;
}
file.SeekToBegin();
file.Write(byinfo,sizeof(byte)*128); //初始分區表
int add=3;
for(i=0;i<num;i++){
Rootlist[i].name[0]=name[i]; //磁盤名
Rootlist[i].start=add; //起始地址
Rootlist[i].type=1; //類型為根目錄
Rootlist[i].ilength=big[i]; //磁盤大小
add=add+big[i];
}
file.Write(&Rootlist,sizeof(List)*byRootnum);
load.RemoveAll();
return TRUE;
}
bool CDisk::Seekroom(char name,int L_address[3],int big)
//尋找空間,在指定的盤 name 找指定的空間 big,L_address[3]為返回空閑地址
{
if(big>3)
return FALSE;
int i,index=0;
for(i=0;i<byRootnum;i++)
{
if(Rootlist[i].name[0]==name) //在指定盤號的位置尋找空間
{
int nCount=Rootlist[i].start+Rootlist[i].ilength;
for(int j=Rootlist[i].start;j<nCount;j++)
{
if(0==byinfo[j])
{
L_address[index]=j;
index++;
if(index==big)
{
return TRUE;
}
}
}
}
}
return FALSE;
}
bool CDisk::Find(char name[6],CString *str,CString * strError)//查找文件
{
int nCount=load.GetSize(); //得到路徑的長度
if(0==nCount) //在根目錄下
{
strError->Format("找不到該文件");
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=='e')
{
char ch[65]={0};
*str="";
byte in;
in=list.start;
for(;2<in&&in<=128;)
{
file.Seek(LtoP(in),CFile::begin);
file.Read(ch,64);
*str+=ch;
in=byinfo[in];
}
return TRUE;
}
}
index=byinfo[index];
if(index>128||index<=2)
break;
}
} //
strError->Format("不能找到該文件");
return FALSE;
}
bool CDisk::Create(char name[3],CString * strError,char potfix) //創建文件.strError為傳送錯誤信息
{
int nCount=load.GetSize(); //得到路徑的長度
if(0==nCount) //在根目錄下
{
strError->Format("在根目錄中不可建立文件");
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(list.name[0]==name[0]&&list.name[1]==name[1]&&list.name[2]==name[2])
{
strError->Format("創建文件失敗\r\n相同的文件名");
return FALSE;
}
index=byinfo[index];
if(index>128||index<=2)
break;
}
} //
int L_address[3];
index= load[0];
if(!Seekroom(Rootlist[index].name[0],L_address))
{
strError->Format("沒有足夠的空間");
return FALSE;
}
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(0==index) //如果在空目錄中創建文件
{
index=list.start=L_address[0];
byinfo[L_address[0]]=255;
file.Seek(LtoP(load[nCount-1]),CFile::begin);
file.Write(&list,sizeof(List));
}
}
for(;byinfo[index]!=0;)
{
if(byinfo[index]>128)
{
byinfo[index]=L_address[0]; //在該文件目錄的最后添加此文件
break;
}
index=byinfo[index];
}
if(0==byinfo[index]) //如果第一次創建文件
{
byinfo[index]=255;
}
byinfo[L_address[0]]=255; //指向他下個連接地址
byinfo[L_address[1]]=255; //修改分配表
list.ilength=0;
list.name[0]=name[0];
list.name[1]=name[1];
list.name[2]=name[2];
list.postfix=potfix;
list.start=L_address[1];
list.type=3;
file.Seek(LtoP((byte)L_address[0]),CFile::begin);
file.Write(&list,sizeof(List));
file.SeekToBegin();
file.Write(byinfo,sizeof(byte)*128);
char ch[64]="";
file.Seek(LtoP((byte)L_address[1]),CFile::begin);
file.Write(ch,64);
return TRUE;
}
bool CDisk::Makdir(char name[3],CString * strError) //創建文件夾.strError為傳送錯誤信息
{
int nCount=load.GetSize(); //得到路徑的長度
if(0==nCount) //在根目錄下
{
strError->Format("在根目錄中不可建立文件");
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(list.name[0]==name[0]&&list.name[1]==name[1]&&list.name[2]==name[2])
{
strError->Format("創建目錄失敗\r\n相同的文件名");
return FALSE;
}
index=byinfo[index];
if(index>128||index<=2)
break;
}
} //
int L_address[3];
index= load[0];
if(!Seekroom(Rootlist[index].name[0],L_address,1))
{
strError->Format("沒有足夠的空間");
return FALSE;
}
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(0==index) //如果在空目錄中創建文件 肯定不在根目錄
{
index=list.start=L_address[0];
byinfo[L_address[0]]=255;
file.Seek(LtoP(load[nCount-1]),CFile::begin);
file.Write(&list,sizeof(List));
}
for(;byinfo[index]!=0;)
{
if(byinfo[index]>128)
{
byinfo[index]=L_address[0]; //在該文件目錄的最后添加此文件
break;
}
index=byinfo[index];
}
if(0==byinfo[index]) //如果第一次創建文件
{
byinfo[index]=255;
}
byinfo[L_address[0]]=255; //修改分配表為已用
list.ilength=0;
list.name[0]=name[0];
list.name[1]=name[1];
list.name[2]=name[2];
list.start=0;
list.type=2;
file.Seek(LtoP((byte)L_address[0]),CFile::begin);
file.Write(&list,sizeof(List));
file.SeekToBegin();
file.Write(byinfo,sizeof(byte)*128);
return TRUE;
}
bool CDisk::CD(char name[3],CString * strError) //進入下一層目錄
{
int nCount=load.GetSize();
if('.'==name[0]&&'.'==name[1]&&' '==name[2])
{
if(0==nCount)
{
strError->Format("根目錄");
return FALSE;
}
load.RemoveAt(nCount-1); //刪除最后一個
return TRUE;
}
if(0==nCount)
{
for(int i=0;i<byRootnum;i++)
{
if(name[0]==Rootlist[i].name[0]&&name[1]==' '&&name[2]==' ')
{
load.Add(i); //如果是進入根目錄,則存根目錄的索引
return TRUE;
}
}
strError->Format("不能找到%c%c%c",name[0],name[1],name[2]);
return FALSE;
}
byte index=load[nCount-1];
if(1==nCount) //如果在*盤中,進入下一層
{
index=Rootlist[index].start;
}
else
{
file.Seek(LtoP(index),CFile::begin);
file.Read(&list,sizeof(List));
index=list.start;
}
while(byinfo[index]>2)
{
file.Seek(LtoP(index),CFile::begin);
file.Read(&list,sizeof(List));
if(1==list.type||2==list.type) //如果是目錄
{
if(list.name[0]==name[0]&&list.name[1]==name[1]&&list.name[2]==name[2])
{
load.Add(index);
return TRUE;
}
}
if(128<index) //如果沒有下一個目錄,跳出
break;
index=byinfo[index];
}
strError->Format("不能找到%c%c%c",name[0],name[1],name[2]);
return FALSE;
}
bool CDisk::Delete(char name[6],CString * strError) //刪除文件
{
int nCount=load.GetSize(); //得到當前路徑層數
byte nextin,in; //下一個地址;
if(0==nCount)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -