⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 文件管理.txt

📁 简单的文件管理系统
💻 TXT
字号:

实习检查:

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〈目录名〉

VC++调试通过

(C)copyright by Neo

欢迎大家测试 请问题请Email:sony006@163.com

*/

#include

#include

#include

#include

#include

#include

// ******************目录和文件的结构定义******

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<<"错误,\""<
}

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<<"工作目录已进入\""<
}

else{

cout<<"错误,\""<
}

}

}

//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<<"\""<
}

else{

flag=0;

while(p){

if(p->type==1){

if(!strcmp(p->name,fileName)){

flag=1;

cout<<"错误,\""<
}

}

p=p->next;

}

if(flag==0){

p=workDir->sub;

while(p->next){

p=p->next;

}

p->next=q;

cout<<"\""<
}

}

}

//3 删除文件

void DEL(char fileName[])

{

dirNode *p,*q;

int flag=0;

p=workDir->sub;

if(p==NULL){

cout<<"错误,\""<
}

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<<"\""<
}

else{

cout<<"错误,\""<
}

}

}

//4 显示所有目录

//显示本目录下所有兄弟目录和文件

void dir(dirNode *p)

{

while(p){

if(p->type==0){

cout.setf(2);

cout<name<"<
}

else{

cout.setf(2);

cout<name<"<size<
}

p=p->next;

}

}

//

void dirs(dirNode *p,char str[])

{

char newstr[100];

dirNode *q;

cout<
eager
	
发表时间:2004-11-24 15:11:06   第1楼
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<<"显示所有目录结构"<
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<<"\""<
}

else{

flag=0;

while(p){

if(p->type==0){

if(!strcmp(p->name,dirName)){

flag=1;

cout<<"错误,\""<
}

}

p=p->next;

}

if(flag==0){

p=workDir->sub;

while(p->next){

p=p->next;

}

p->next=q;

cout<<"\""<
}

}

}

//6 删除目录

void RD(char dirName[])

{

/*

删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否

作删除,删除操作将该目录下的全部文件和子目录都删除

这题目有点问题,因为CD只要求完成改变到当前目录的某一个子目录

下的功能,不要求实现相对目录以及绝对目录。所以不进入子目录是不可能在子目录下再建子目录或文件的。

因此只要实现删除工作目录的子目录就可以了,不要去管“如果该目录为空,则可删除,否则应提示是否

作删除,删除操作将该目录下的全部文件和子目录都删除”。

*/

dirNode *p,*q;

int flag=0;

p=workDir->sub;

if(p==NULL){

cout<<"错误,\""<
}

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<<"\""<
}

else{

cout<<"错误,\""<
}

}



}

//显示版权信息函数

void version()

{

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

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<
cout<
cout<
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<<"命令错误"<
}

}

}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -