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

📄 文件管理.txt

📁 操作系统各个方面的编程
💻 TXT
字号:
/*本程序包括实现: 

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

⌨️ 快捷键说明

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