?? 文件管理.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 + -