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