Posted on 2010-08-17 13:04
Brian 閱讀(1871)
評論(5) 編輯 收藏 引用 所屬分類:
OS
/*
Title: 文件管理
Author: Brian
Date: 2010/06/17
*/
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef struct UNode{ // UFD結點
char FileName[12]; // 文件名
char ProCode[4]; // 保護碼
int length; // 文件長度
int Open_RW; // 文件打開關閉讀寫指針
struct UNode *next; // 后向指針
struct UNode *prior; // 前向指針
}* UFD;
typedef struct MNode{ // MDF結點
char UserName[12]; // 用戶名
char Password[12]; // 密碼
struct UNode *FileMenu; // 文件目錄指針
struct MNode *next; // 后向指針
}* MDF;
MDF H=(MDF)malloc(sizeof(MNode)); // 全局變量,指向MDF頭結點(數據項為空)
MDF CurrUser; // 全局變量,當前操作用戶指針
//---------------------------函數聲明------------------------------
void Welcome(); // 操作界面
void InitSystem(); // 從文件將默認MDF和UFD組織起來進入內存
UFD InitUFD(MDF p); //首次創建用戶的文件
void DispMDF(); // 顯示用戶名列表
void DispMDF(); // 顯示用戶名列表
void DispUFD(MDF L); // 顯示UFD里的各個文件名
int LoginCheck(); // 搜索用戶名是否存在
void Create(); // 創建新文件
void Delete(); // 刪除文件
void Open(); // 打開文件
void Close(); // 關閉文件
void Read(); // 讀文件
void Write(); // 寫文件
void Bye(); // 打印MDF和UFD表并退出
//-----------------------------------------------------------------
void InitSystem() // 從文件將默認MDF和UFD組織起來進入內存
{
//"InitInfo.txt" 所有初始化信息都已寫入該文件,這里未使用文件流
H->FileMenu=NULL;
H->next=NULL;
MDF p=H;
int UserNum; // 初始化時用戶個數和文件個數
cout<<"系統初始化開始,請輸入用戶名個數: ";
cin>>UserNum;
for (int i=1; i<=UserNum; i++)
{
p=p->next=(MDF)malloc(sizeof(MNode));
cout<<"\n請輸入第 "<<i<<" 個用戶的用戶名和密碼: ";
cin>>p->UserName;
cin>>p->Password; // 初始化MDF結點
p->FileMenu=InitUFD(p);
p->next=NULL;
}
cout<<"\n初始化完畢,按任意鍵清屏并開始文件管理!\n";
system("pause");
char c;
cin.get(c);
system("cls");
}
UFD InitUFD(MDF p) //首次創建用戶的文件
{
UFD s,r,L=(UFD)malloc(sizeof(UNode)); // 初始化當前用戶的所有文件UFD
L->next=NULL;
r=L;
int FileNum;
cout<<"請輸入用戶 "<<p->UserName<<" 將要創建的文件個數: ";
cin>>FileNum;
cout<<"請輸入用戶 "<<p->UserName<<" 的所有文件名,保護碼和長度: ";
for (int j=1; j<=FileNum; j++)
{
s=(UFD)malloc(sizeof(UNode));
cin>>s->FileName; //讀取文件名
cin>>s->ProCode; // 讀取保護碼
cin>>s->length; //文件長度
s->Open_RW=0;
r->next=s;
s->prior=r;
r=s;
}
r->next=NULL; // UFD是雙向鏈表,便于刪除
return L->next;
}
void DispMDF() // 顯示用戶名列表
{
cout<<"現有用戶名列表: ";
MDF p=H->next;
while (p)
{
cout<<"\t"<<p->UserName;
p=p->next;
}
cout<<endl;
}
void DispUFD(MDF L) // 顯示UFD里的各個文件名
{
cout<<endl<<"當前文件的UFD為:\n"
<<" "<<L->UserName<<endl
<<"---------\n";
UFD p=L->FileMenu;
if (!p)
{
cout<<L->UserName<<" 用戶無文件,現在創建文件嗎? (y/n)";
char c; cin.get(c); // 為無文件用戶第一次創建文件
if (c=='y') L->FileMenu=InitUFD(L);
else return;
}
while (p)
{
cout<<" "<<p->FileName<<endl;
p=p->next;
}
cout<<"---------\n";
}
int LoginCheck() // 搜索用戶名是否存在
{
char UserName[12],PassWord[12];
while(1)
{
cout<<"請輸入用戶名: ";
cin>>UserName;
MDF p=H->next;
while (p)
{
if (strcmp(UserName,p->UserName) == 0)
{
cout<<"用戶查找成功! 請輸入密碼: ";
cin>>PassWord;
if (strcmp(PassWord,p->Password) == 0)
cout<<"登錄成功!\n";
else {
cout<<"密碼錯誤請重新登錄!\n";
return 0;
}
CurrUser=p;
return 1;
}
p=p->next;
}
cout<<"無此用戶文件!\n";
return 0;
}
}
void Create() // 創建新文件 F
{
char CreateName[12];
UFD p=CurrUser->FileMenu,s;
cout<<"請輸入要創建的文件名: ";
cin>>CreateName;
while (p)
{
if (strcmp(CreateName,p->FileName)==0)
{
cout<<"此文件已經存在,創建失敗!\n";
return;
}
p=p->next;
}
s=(UFD)malloc(sizeof(UNode));
strcpy(s->FileName,CreateName);
cout<<"請輸入 "<<CreateName<<" 文件的保護碼和長度: ";
cin>>s->ProCode;
cin>>s->length;
s->Open_RW=0;
s->prior=NULL;
UFD r=CurrUser->FileMenu;
CurrUser->FileMenu=s;
s->next=r;
r->prior=s; // 創建的新文件采用頭插法置于UFD最前端
DispUFD(CurrUser); // 顯示當前UFD
}
void Delete() // 刪除文件
{
char FileName[12];
cout<<"請輸入要刪除的文件名: ";
cin>>FileName;
UFD p=CurrUser->FileMenu,temp;
if (strcmp(FileName,p->FileName)==0) // 頭結點文件時要刪除的文件
{
CurrUser->FileMenu=CurrUser->FileMenu->next;
free(p);
cout<<"文件刪除成功!\n";
DispUFD(CurrUser); // 顯示當前UFD
return;
}
while (p->next)
{
if (strcmp(FileName,p->next->FileName)==0)
{
temp=p->next;
p->next=p->next->next;
free(temp);
cout<<"文件刪除成功!\n";
DispUFD(CurrUser); // 顯示當前UFD
return;
}
p=p->next;
}
cout<<"您要刪除的文件不存在!\n";
DispUFD(CurrUser); // 顯示當前UFD
}
void Open() // 打開文件
{
char FileName[12];
UFD p=CurrUser->FileMenu;
cout<<"請輸入要打開的文件名: ";
cin>>FileName;
while (p)
{
if (strcmp(FileName,p->FileName)==0)
{
if (!p->Open_RW)
{
cout<<"文件打開成功!\n";
p->Open_RW=1;
}
else cout<<"文件已打開,重復打開失敗!\n";
return;
}
p=p->next;
}
cout<<"您要打開的文件不存在!\n";
DispUFD(CurrUser); // 顯示當前UFD
}
void Close() //關閉文件
{
char FileName[12];
UFD p=CurrUser->FileMenu;
cout<<"已打開的文件有:\n"
<<"-----------\n";
while (p)
{
if (p->Open_RW) cout<<" "<<p->FileName<<endl;
p=p->next;
}
cout<<"-----------\n";
p=CurrUser->FileMenu;
cout<<"請輸入要關閉的文件名: ";
cin>>FileName;
while (p)
{
if (strcmp(FileName,p->FileName)==0)
{
if (p->Open_RW)
{
cout<<"文件關閉成功!\n";
p->Open_RW=0;
}
else cout<<"文件未被打開,關閉失敗!";
return;
}
p=p->next;
}
cout<<"您要關閉的文件不存在!\n";
DispUFD(CurrUser); // 顯示當前UFD
}
void Read() // 讀文件
{
char FileName[12];
UFD p=CurrUser->FileMenu;
cout<<"已打開的文件有:\n"
<<"-----------\n";
while (p)
{
if (p->Open_RW) cout<<" "<<p->FileName<<endl;
p=p->next;
}
cout<<"-----------\n";
p=CurrUser->FileMenu;
cout<<"請輸入要讀的文件名: ";
cin>>FileName;
while (p)
{
if (strcmp(FileName,p->FileName) == 0)
{
if (p->Open_RW)
{
if (strcmp("111",p->ProCode)==0 ||
strcmp("110",p->ProCode)==0 ||
strcmp("101",p->ProCode)==0 ||
strcmp("100",p->ProCode)==0 )
cout<<"文件讀成功!\n";
else cout<<"文件保護類型不允許讀文件\n";
}
else cout<<"該文件未被打開,請先進行打開操作!";
return;
}
p=p->next;
}
cout<<"該文件文件不存在!\n";
DispUFD(CurrUser); // 顯示當前UFD
}
void Write() // 寫文件
{
char FileName[12];
UFD p=CurrUser->FileMenu;
cout<<"已打開的文件有:\n"
<<"-----------\n";
while (p)
{
if (p->Open_RW) cout<<" "<<p->FileName<<endl;
p=p->next;
}
cout<<"-----------\n";
p=CurrUser->FileMenu;
cout<<"請輸入要寫的文件名: ";
cin>>FileName;
while (p)
{
if (strcmp(FileName,p->FileName) == 0)
{
if (p->Open_RW)
{
if (strcmp("010",p->ProCode)==0 ||
strcmp("110",p->ProCode)==0 ||
strcmp("111",p->ProCode)==0 ||
strcmp("011",p->ProCode)==0 )
cout<<"文件寫成功!\n";
else cout<<"文件保護類型不允許寫文件\n";
}
else cout<<"該文件未被打開,請先進行打開操作!";
return;
}
p=p->next;
}
cout<<"該文件文件不存在!\n";
DispUFD(CurrUser); // 顯示當前UFD
}
void Bye() // 退出系統
{
DispMDF();
DispUFD(CurrUser); // 顯示當前UFD
}
void Welcome() // 操作界面
{
cout<<"\n------------File Management------------\n"
<<" 1. Create 2. Delete 3. Open\n"
<<" 4. Close 5. Read 6. Write\n"
<<" 7. Bye 8. ReLogin \n"
<<" 9. MDF 10. UFD \n"
<<"--------------------------------------\n"
<<"請選擇操作命令: ";
}
void main()
{
InitSystem();
int choice;
ST: if (LoginCheck())
{
while (1)
{
Welcome(); // 操作界面
cin>>choice;
switch (choice)
{
case 1: Create(); break; // 創建新文件
case 2: Delete(); break; // 刪除文件
case 3: Open(); break; // 打開文件
case 4: Close(); break; // 關閉文件
case 5: Read(); break; // 讀文件
case 6: Write(); break; // 寫文件
case 7: Bye(); goto END; // 打印MDF和UFD表并退出
case 8: goto ST;
case 9: DispMDF(); break;
case 10: DispUFD(CurrUser); break;
}
}
}
goto ST;
END: cout<<"已成功退出系統!\n";
system("pause");
}