운영 체제 실험 4 파일 시스템 관리
5930 단어 운영 체제
파일 내용과 명령을 이용하여 트리 디렉터리 구조를 실현합니다.비트맵을 이용하여 외부 저장의 분배 상황을 표시하고 새 파일을 만들 때 필요한 공간을 분배하며 파일 분배표(FAT)는 파일이 외부 저장에 저장되는 방식을 모의한다.
컨텐츠 요구 사항:
파일에 디렉터리 내용을 저장하고 파일이나 하위 디렉터리를 만들려면 명령줄 명령을 사용하십시오: MD, CD, RD, MK(창건문
부품), DEL(파일 삭제) 및 DIR.카탈로그 항목에는 파일 또는 카탈로그 이름, 유형(파일, 카탈로그 또는 빈 카탈로그 항목), 작성 날짜 및 다음 카탈로그 항목 포인터, 다음 카탈로그 항목 포인터가 포함됩니다.
① 초기 파일을 만들고 루트 디렉토리의 "."를 만듭니다."..."디렉토리 항목.
②'*','?'를 실현한다.를 참고하십시오.
③ 명령을 입력한 후 명령의 의미에 따라 파일 작업을 완료합니다.
MD: 디렉터리 파일에 하위 디렉터리를 만들고 현재 디렉터리의 마지막 디렉터리 항목을 검색하고 포인터 정보를 저장합니다.
CD: 현재 디렉토리를 기준으로 지정된 디렉토리로 전환합니다.
RD: 삭제할 디렉터리가 빈 디렉터리인지 검색하고 삭제할 경우 삭제합니다.
MK: 현재 디렉토리에 파일 이름을 생성합니다.(신청 공간 활용 비트맵 수정 FAT)
DEL: 삭제할 파일이 있는지 검색하고 삭제할 경우(복구 비트 맵 수정 FAT)
DIR: 현재 디렉토리의 모든 디렉토리 항목을 나열합니다.
④ 파일을 만들 때 빈 디스크 공간을 분배하고 링크를 표시하는 방식으로 파일 분배표(FAT)를 이용하여 파일이 외부에 저장된 상황을 기록한다.
⑤ 파일을 삭제할 때 외부에 저장된 공간을 회수하고 비트맵과 파일 분배표를 수정한다.
구현 프로세스:
#include
#include
using namespace std;
struct FCB
{
char name[100];
int year,month,day,hour,minute,second;
int length;
int startaddr;
int node;
}fcb[1000];
struct Directory
{
char name[100][100];
int year,month,day,hour,minute,second;
int judge[100]; /*0 ,1 */
int link[100];
int node;
int num;
}Dir[1000];
int path = 1,Time = 1,used_fcb = 0,used_dir = 1;
int step = 0;
char steps[100][100]; /*step ,steps */
int FAT[256]; /* FAT */
int Memory = 0;
char bitmap[32]; /* */
time_t T; /* */
struct tm *TimeP; /* localtime */
void init(int n,int root) /* */
{
strcpy(Dir[n].name[0],".");
strcpy(Dir[n].name[1],"..");
Dir[n].judge[0]=Dir[n].judge[1] = 0;
Dir[n].link[0] = Time;
Dir[n].link[1] = root;
Dir[n].node = Time ++;
Dir[n].num = 2;
T = time(NULL);
TimeP = localtime( &T );
Dir[n].year = (TimeP->tm_year) +1900;
Dir[n].month = (TimeP->tm_mon) + 1;
Dir[n].day = (TimeP->tm_mday);
Dir[n].hour = (TimeP->tm_hour);
Dir[n].minute = (TimeP->tm_min);
Dir[n].second = (TimeP->tm_sec);
}
bool get_bit_map(int n);
void init_bit_map() /* */
{
int i;
for(i = 0 ; i < 32 ; i ++)
bitmap[i] = rand()%256;
for(i = 0 ; i < 256 ; i ++)
FAT[i] = -1;
for(i = 0 ; i < 256 ; i++)
if(get_bit_map(i) == 0)
Memory ++;
}
void show_bit_map() /* */
{
int i,j;
cout << " " <>op;
for(i = 2 ;i < Dir[path-1].num ; i ++)
if(!Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],op))
{
cout<>op;
for(i = 2 ; i < Dir[path-1].num ; i ++)
if(!Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],op))
{
if(Dir[Dir[path-1].link[i]-1].num >2)
cout<\t";
cout<=strlen(choose))
{
if(!Dir[path-1].judge[i])
{
cout<\t";
cout<>op;
if(!strcmp(op,"\\"))
{
path=1;
step=0;
return ;
}
for(i = 0 ; i < Dir[path-1].num ; i ++)
if(!Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],op))
{
path=Dir[path-1].link[i];
if(i == 1 && step)
step--;
else if(i != 1 && i)
{
strcpy(steps[step++],op);
}
return ;
}
cout<>fcb[used_fcb].name;
cin>>fcb[used_fcb].length;
Memory -= fcb[used_fcb].length;
for(i = 2 ; i < Dir[path-1].num ; i ++)
if(Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],fcb[used_fcb].name))
{
cout<tm_year) + 1900;
fcb[used_fcb].month = (TimeP->tm_mon) + 1;
fcb[used_fcb].day = (TimeP->tm_mday) ;
fcb[used_fcb].hour = (TimeP->tm_hour);
fcb[used_fcb].minute = (TimeP->tm_min);
fcb[used_fcb].second = (TimeP->tm_sec);
Dir[path-1].num++;
used_fcb++;
}
void rk() /* */
{
int i,j,k;
char na[100];
cin>>na;
for(i = 2 ; i < Dir[path-1].num ; i ++)
if(Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],na))
{
k = fcb[Dir[path-1].link[i]].startaddr;
for(j=0;j";
for(int i = 0 ; i < step ; i ++)
{
cout<';
}
return true;
}
void choose()
{
char op[100],choose[100];
while(outputpath() && cin>>op && strcmp(op,"exit"))
{
memset(choose,'\0',sizeof(choose));
if(!strcmp(op,"cd"))
{
cd();
}
else if(!strcmp(op,"rd"))
{
rd();
}
else if(!strcmp(op,"md"))
{
md();
}
else if(!strcmp(op,"tree"))
{
tree(path,0);
}
else if(!strcmp(op,"mk"))
{
mk();
}
else if(!strcmp(op,"rk"))
{
rk();
}
else if(!strcmp(op,"dir"))
{
getchar();
gets(choose);
if(choose[0]!='\0')
_dir(choose);
else
dir();
}
else if(!strcmp(op,"cls"))
{
system("cls");
}
}
}
int main()
{
init(0,1);
cout << "Microsoft Windows XP [ 5.1.2600]
(C) 20092612 Zhang Bing.
" << endl;
init_bit_map();
choose();
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
독서 노트문제1: 한 파일에 10000000개의 기록이 포함되어 있으며, 각 기록의 내용은 7자리의 정수이다.기록은 중복되지 않는다.파일 내용을 읽는 프로그램이 필요하고, 이 기록을 정렬한 후 파일을 출력해야 하며, 메모리는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.