(六)文件管理

文件管理的试题比较多,主要就是模拟操作系统中的 建立文件、打开文件、读文件、写文件、、关闭文件、 、删除文件、、建立目录、、
显示目录内容、显示文件内容、、改变文件属性等操作。大家可以参考书本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
<< " ┃      [email protected]          ┃ " << 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://my.oschina.net/garyun/blog/602922

猜你喜欢

转载自blog.csdn.net/weixin_34082695/article/details/91774514
今日推荐