(六)文件管理

文件管理的试题比较多,主要就是模拟操作系统中的 建立文件、打开文件、读文件、写文件、、关闭文件、 、删除文件、、建立目录、、
显示目录内容、显示文件内容、、改变文件属性等操作。大家可以参考书本253页的上机指导。

北大2001年试题:
建立一个树型文件目录
假设程序启动运行后在根目录下且根目录为空。

实习检查:
1、运行程序,由检查教师给出文件名,该文件中存有相应的若干命令。(程序应做提示,界面友好)。
2、要求实现两个命令:
mkdir 目录名(目录已存在,应给出错误信息。)
cd 目录名(目录不存在,应给出错误信息。)
3、你所编制的程序应读入文件,并执行其中的每一条命令。
4、在屏幕上显示文件目录的结构。(界面自己设计,但要清晰明了。)

2002年北京大学的试题:
操作系统上机考试题
题目:模拟文件系统
要求:模拟一个文件系统,包括目录文件,普通文件,并实现对它们的一些
基本操作。
假定每个目录文件最多只能占用一个块;一个目录项包括文件名(下一级目录
名),文件类型,文件长度,指向文件内容(下一级目录)的指针内容。普通文件可以
只用目录项(FCB)代表。(详细的数据结构见后面的说明)
程序功能方面的要求:
需要实现一个命令行操作界面,包含如下命令:
1 改变目录
格式:CD〈目录名〉
功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录
下的功能,不要求实现相对目录以及绝对目录。
2 创建文件
格式:CREATE〈文件名〉〈文件长度〉
功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必
须能输入文件长度。
3 删除文件
格式:DEL〈希望删除的文件名〉
功能:删除指定的文件
4 显示目录
格式:LSALL
功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。
图示如图。
5 创建目录
格式:MD〈目录名〉
功能:在当前路径下创建指定的目录
6 删除目录
格式:RD〈目录名〉
功能:删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否
作删除,删除操作将该目录下的全部文件和子目录都删除。
对于上述功能要求,完成1-4为及格,完成1-5为良,完成1-6为优。

程序实现方面的要求:
1 对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误*
作情况,程序应该作出相应处理并给出错误信息,但是程序不得因此而退出。
2 界面友好,程序强壮。
3 界面的提示符为#,提示的命令以及调试的方法应和前面的要求一致。不要自己设计命
令或者附加不要求的功能。
4 在考卷的说明部分(背面)有一段程序的源代码以及对源代码的说明,考试的编码应
在这个程序的基础上修改而成。这段源代码中规定了文件系统使用的数据结构和需要实
现的函数框架,请将你的实现代码填写到合适的位置中去,可以自己添加辅助数据结构、
变量、常量以及函数,但是不得改变已有的代码(如数据结构的定义以及函数的名称以
及参数说明)。
5 考试提交的源程序请命名为filesys.c。
6 程序设计环境使用TC2.0,在DOS操作系统下完成全部程序代码。

本程序包括实现:

1 改变目录
格式:CD〈目录名〉
功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录
下的功能,不要求实现相对目录以及绝对目录。
2 创建文件
格式:CREATE〈文件名〉〈文件长度〉
功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必
须能输入文件长度。
3 删除文件
格式:DEL〈希望删除的文件名〉
功能:删除指定的文件
4 显示目录
格式:LSALL
功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。
图示如图。
5 创建目录
格式:MD〈目录名〉
功能:在当前路径下创建指定的目录
6 删除目录
格式:RD〈目录名〉

文件管理
#include<stdio.h>
#include
<string.h>
#include
<iostream.h>
#include
<math.h>
#include
<stdlib.h>
#include
<iomanip.h>

// ******************目录和文件的结构定义******
typedef struct node{
char name[50]; /*目录或文件的名字*/
int type; /*0代表目录,1代表普通文件*/
struct node *next; /*指向下一个兄弟结点的指针*/
struct node *sub; /*指向第一个子结点的指针*/
struct node *father; /*指向父结点的指针*/

int size; /*如果是文件则表示文件的大小*/

}dirNode;

dirNode
*workDir; //定义当前工作目录
dirNode root; //定义根目录

char path[100]; //定义路径信息

//初始化函数
void initial()
{
strcpy(root.name,
"root");
root.type
=0;
root.next
=NULL;
root.sub
=NULL;
root.father
=NULL;
root.size
=0;

workDir
=&root;

strcpy(path,
"root");
}

//初始化新结点函数
dirNode *init()
{
dirNode
*p;

p
=new dirNode;

strcpy(root.name,
"");
root.type
=0;
root.next
=NULL;
root.sub
=NULL;
root.father
=NULL;
root.size
=0;

return p;
}

//1 改变目录
void CD(char dirName[])
{
dirNode
*p;
int flag=0;

p
=workDir->sub;
if(p==NULL){
cout
<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
}
else{
while(p){
if(p->type==0){
if(!strcmp(p->name,dirName)){
flag
=1;
break;
}
}
p
=p->next;
}
if(flag==1){
workDir
=p;
strcat(path,
"\\ ");
strcat(path,p
->name);
cout
<<"工作目录已进入\""<<dirName<<"\""<<endl;
}
else{
cout
<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
}
}
}

//2 创建文件
void CREATE(char fileName[],int fileSize)
{
int flag;
dirNode
*p,*q;

q
=new dirNode;
strcpy(q
->name,fileName);
q
->sub=NULL;
q
->type=1;
q
->next=NULL;
q
->father=workDir;
q
->size=fileSize;

p
=workDir->sub;

if(p==NULL){
workDir
->sub=q;
cout
<<"\""<<fileName<<"\"文件创建成功"<<endl;
}
else{
flag
=0;
while(p){
if(p->type==1){
if(!strcmp(p->name,fileName)){
flag
=1;
cout
<<"错误,\""<<fileName<<"\"文件已存在"<<endl;
}
}
p
=p->next;
}
if(flag==0){
p
=workDir->sub;
while(p->next){
p
=p->next;
}
p
->next=q;
cout
<<"\""<<fileName<<"\"文件创建成功"<<endl;
}
}
}

//3 删除文件
void DEL(char fileName[])
{
dirNode
*p,*q;
int flag=0;

p
=workDir->sub;
if(p==NULL){
cout
<<"错误,\""<<fileName<<"\"文件不存在"<<endl;
}
else{
while(p){
if(p->type==1){
if(!strcmp(p->name,fileName)){
flag
=1;
break;
}
}
p
=p->next;
}
if(flag==1){
if(p==workDir->sub){
workDir
->sub=p->next;
}
else{
q
=workDir->sub;
while(q->next!=p){
q
=q->next;
}
q
->next=p->next;
delete p;
}
cout
<<"\""<<fileName<<"\"文件已删除"<<endl;
}
else{
cout
<<"错误,\""<<fileName<<"\"文件不存在"<<endl;
}
}

}

//4 显示所有目录

//显示本目录下所有兄弟目录和文件
void dir(dirNode *p)
{
while(p){
if(p->type==0){
cout.setf(
2);
cout
<<setw(14)<<p->name<<setw(12)<<"<DIR>"<<endl;
}
else{
cout.setf(
2);
cout
<<setw(14)<<p->name<<setw(12)<<"<FILE>"<<setw(10)<<p->size<<endl;
}
p
=p->next;
}
}
//
void dirs(dirNode *p,char str[])
{
char newstr[100];
dirNode
*q;
cout
<<str<<"下子目录及文件:"<<endl;
dir(p);

q
=p;
if(q->sub){
strcpy(newstr,
"");
strcat(newstr,str);
strcat(newstr,
"\\");
strcat(newstr,q
->name);

dirs(q
->sub,newstr);
}
q
=p;
while(q->next){
if(q->next->sub){
strcpy(newstr,
"");
strcat(newstr,str);
strcat(newstr,
" \\");
strcat(newstr,q
->next->name);

dirs(q
->next->sub,newstr);
}
q
=q->next;
}
}

// 显示所有目录
void LSALL()
{
dirNode
*p;

cout
<<"显示所有目录结构"<<endl<<"--------------------------------------------"<<endl;

p
=root.sub;

dirs(p,
"root");


}
//5 创建目录
void MD(char dirName[])
{
int flag;
dirNode
*p,*q;

q
=new dirNode;
strcpy(q
->name,dirName);
q
->sub=NULL;
q
->type=0;
q
->next=NULL;
q
->father=workDir;
q
->size=0;

p
=workDir->sub;

if(p==NULL){
workDir
->sub=q;
cout
<<"\""<<dirName<<"\"子目录创建成功"<<endl;
}
else{
flag
=0;
while(p){
if(p->type==0){
if(!strcmp(p->name,dirName)){
flag
=1;
cout
<<"错误,\""<<dirName<<"\"子目录已存在"<<endl;
}
}
p
=p->next;
}
if(flag==0){
p
=workDir->sub;
while(p->next){
p
=p->next;
}
p
->next=q;
cout
<<"\""<<dirName<<"\"子目录创建成功"<<endl;
}
}
}

//6 删除目录
void RD(char dirName[])
{
/*
删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否
作删除,删除操作将该目录下的全部文件和子目录都删除

这题目有点问题,因为CD只要求完成改变到当前目录的某一个子目录
下的功能,不要求实现相对目录以及绝对目录。所以不进入子目录是不可能在子目录下再建子目录或文件的。
因此只要实现删除工作目录的子目录就可以了,不要去管“如果该目录为空,则可删除,否则应提示是否
作删除,删除操作将该目录下的全部文件和子目录都删除”。
*/
dirNode
*p,*q;
int flag=0;

p
=workDir->sub;
if(p==NULL){
cout
<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
}
else{
while(p){
if(p->type==0){
if(!strcmp(p->name,dirName)){
flag
=1;
break;
}
}
p
=p->next;
}
if(flag==1){
if(p==workDir->sub){
workDir
->sub=p->next;
}
else{
q
=workDir->sub;
while(q->next!=p){
q
=q->next;
}
q
->next=p->next;
delete p;
}
cout
<<"\""<<dirName<<"\"子目录已删除"<<endl;
}
else{
cout
<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
}
}


}

//显示版权信息函数
void version()
{
cout
<<endl<<endl;

cout
<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
cout
<<" ┃     模拟文件管理模拟系统        ┃"<<endl;
cout
<<" ┠───────────────────────┨"<<endl;
cout
<<" ┃   (c)All Right Reserved Neo       ┃"<<endl;
cout
<<" ┃      sony006@163.com          ┃"<<endl;
cout
<<" ┃     version 2004 build 1122      ┃"<<endl;
cout
<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;

cout
<<endl<<endl;
}

void main()
{
int len,fileSize,flag,comm;

char string[50];
char command[10];
char name[40];
char *s,*s1;

version();

initial();


flag
=1;
while(flag){
cout
<<endl<<" 模拟文件管理模拟系统"<<endl;
cout
<<endl<<"CD 改变目录 CREATE 创建文件 DEL 删除文件 "<<endl<<"LSALL 显示目录 MD 创建目录 RD 删除目录"<<endl<<"exit 退出"<<endl;
cout
<<endl<<"-----------------------------------------------"<<endl;
printf(
"%s:>#",path);

gets(
string);
len
=strlen(string);

if(len==0){
strcpy(command,
"errer");
}
else{
//获得命令
s=NULL;
s
=strchr(string,' ');
if(s!=NULL){
*s='\0';
}
strcpy(command,
string);

//测试命令类型
if((!strcmp(command,"CD"))||!strcmp(command,"cd")){
comm
=1;
}
else{
if((!strcmp(command,"CREATE"))||!strcmp(command,"create")){
comm
=2;
}
else{
if((!strcmp(command,"DEL"))||!strcmp(command,"del")){
comm
=3;
}
else{
if((!strcmp(command,"LSALL"))||!strcmp(command,"lsall")){
comm
=4;
}
else{
if((!strcmp(command,"MD"))||!strcmp(command,"md")){
comm
=5;
}
else{
if((!strcmp(command,"RD"))||!strcmp(command,"rd")){
comm
=6;
}
else{
if((!strcmp(command,"EXIT"))||!strcmp(command,"exit")){
comm
=0;
}
else{
comm
=100;
}
}
}
}
}
}
}
switch(comm){
case 1:
//1 改变目录
strcpy(name,s+1);
CD(name);
break;
case 2:
//2 创建文件
s1=strchr(s+1,' ');
*s1='\0';
strcpy(name,s
+1);
fileSize
=atoi(s1+1);
CREATE(name,fileSize);
break;
case 3:
//3 删除文件
strcpy(name,s+1);
DEL(name);
break;
case 4:
//4 显示目录
LSALL();
break;
case 5:
//5 创建目录
strcpy(name,s+1);
MD(name);
break;
case 6:
//6 删除目录
strcpy(name,s+1);
RD(name);
break;
case 0:
//0 退出系统
flag=0;
break;
default:
cout
<<"命令错误"<<endl;
}
}
}
}
原文地址:https://www.cnblogs.com/FCWORLD/p/1896360.html