采用二级文件目录结构,编写程序实现文件系统的文件存储空间的管理、文件的物理结构、目录结构管理和文件操作。
1、设计一个有m个用户的文件系统,每个用户最多可保存一个文件。
2、规定用户在一次运行中只能打开K个文件。
3、系统能检查键入命令的正确性,出错时应能显示出错原因。
4、对文件应能设置保护措施,如只能执行、允许读、允许写等。
5、对文件的操作设计提供一套文件操作:
CREATE建立文件;
DELETE删除文件;
OPEN打开文件;
CLOSE关闭文件;
READ读文件;
WRITE写文件。
6、二级目录结构如下:
主文件目录MFD
用户名 | 用户文件目录地址 |
---|---|
UserName | * |
用户文件目录UFD
文件名 | 状态(打开/建立) | 指针 |
---|---|---|
FileName | On/Off | * |
程序代码:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
#define MAX_USER_CNT 10
#define MAX_FILE_OPN 10
#define MAX_FILE_CNT 1
struct UFDItem {
string fileName;
bool opened, readonly;
string data;
UFDItem(string fn, bool o, bool r) {
fileName = fn;
opened = o;
readonly = r;
data = "";
}
};
typedef vector<UFDItem> UFD;
struct MFDItem {
string userName;
UFD ufd;
MFDItem(string un) {
userName = un;
}
};
typedef vector<MFDItem> MFD;
MFD mfd;
MFD::iterator currentUser;
int openedFileCnt;
bool checkUser() {
if (currentUser == mfd.end()) {
puts("当前没有登录的用户! "); return false;
}
return true;
}
UFD::iterator getFile(string fileName, bool opened = false) {
UFD &ufd = currentUser->ufd;
for (UFD::iterator it = ufd.begin(); it != ufd.end(); it++) {
if (it->fileName == fileName && (!opened || it->opened)) return it;
}
return ufd.end();
}
void dir(bool opened) {
if (checkUser()) {
bool empty = true;
UFD &ufd = currentUser->ufd;
for (UFD::iterator it = ufd.begin(); it != ufd.end(); it++) {
if (!opened || it->opened) {
cout<< it->fileName.c_str()<<"\t"<<(it->readonly ? "readonly" : "readwrite")<<"\t"<<(it->opened ? "opened" : "")<<endl;
empty = false;
}
}
if (empty) puts("文件列表为空! ");
}
}
bool readFile(string fileName) {
if (!checkUser()) return false;
UFD &ufd = currentUser->ufd;
UFD::iterator it = getFile(fileName, true);
if (it == ufd.end()) {
cout<<"文件"<<fileName.c_str()<<"不存在或未被打开! \n";
return false;
}
else {
cout << "文件" << fileName.c_str() << "打开成功!文件内容为:" << it->data.c_str() << endl;
return true;
}
}
bool writeFile(string fileName, string data) {
if (!checkUser()) return false;
UFD &ufd = currentUser->ufd;
UFD::iterator it = getFile(fileName, true);
if (it == ufd.end()) {
cout<<" 文件"<<fileName.c_str()<<"不存在或未被打开! \n"; return false;
}
else {
if (it->readonly) {
cout<<" 文件"<<fileName.c_str()<<"是只读的,不能写入文件!\n"; return false;
}
else {
it->data = data; cout<<"文件"<<fileName.c_str()<<"写入成功! \n"; return true;
}
}
}
bool closeFile(string fileName) {
if (!checkUser()) return false;
UFD &ufd = currentUser->ufd;
UFD::iterator it = getFile(fileName, true); if (it == ufd.end()) {
cout<<"文件"<<fileName.c_str()<<"不存在或未被打开! \n"; return false;
}
else {
it->opened = false;
openedFileCnt--; cout<<"文件"<<fileName.c_str()<<"关闭成功! \n"; return true;
}
}
bool openFile(string fileName) {
if (!checkUser()) return false;
UFD &ufd = currentUser->ufd;
UFD::iterator it = getFile(fileName);
if (it == ufd.end()) {
cout<<"找不到文件"<<fileName.c_str()<<"!\n"; return false;
}
else {
if (it->opened) {
cout<<"文件"<<fileName.c_str()<<"已经打开。 \n"; return false;
}
if (openedFileCnt >= MAX_FILE_OPN) {
cout << "现在已经打开" << MAX_FILE_OPN << "个文件,达到上限。\n";
return false;
}
it->opened = true; openedFileCnt++; cout<<"文件"<<fileName.c_str()<<"打开成功! \n";
return true;
}
}
bool deleteFile(string fileName) {
if (!checkUser()) return false;
UFD &ufd = currentUser->ufd;
UFD::iterator it = getFile(fileName);
if (it == ufd.end()) {
cout<<"找不到"<<fileName.c_str()<<"文件\n"; return false;
}
else {
if (it->opened) {
cout<<"文件"<<fileName.c_str()<<"正在被使用,不能被删除! \n"; return false;
}
ufd.erase(it); cout<<"文件"<<fileName.c_str()<<"删除成功! \n"; return true;
}
}
bool createFile(string fileName, bool readonly) {
if (!checkUser()) return false;
UFD &ufd = currentUser->ufd;
if (ufd.size() >= MAX_FILE_CNT) {
cout<<"该用户已创建"<<MAX_FILE_CNT<<"个文件,达到上限。 \n"; return false;
}
UFD::iterator it = getFile(fileName);
if (it != ufd.end()) {
cout<<"文件"<<fileName.c_str()<<"已存在! \n"; return false;
} ufd.push_back(UFDItem(fileName, false, readonly)); cout<<"文件"<<fileName.c_str()<<"创建成功! \n";
return true;
}
bool login(string userName) {
if (currentUser != mfd.end()) {
if (currentUser->userName == userName) puts("该用户已登录。 "); else puts("已有用户登录,请使用 switch 命令切换用户。 "); return false;
}
for (MFD::iterator it = mfd.begin(); it != mfd.end(); it++) {
if (it->userName == userName) {
puts("登录成功! "); currentUser = it;
UFD &ufd = it->ufd;
for (UFD::iterator it = ufd.begin(); it != ufd.end(); it++) {
if (it->opened) it->opened = false;
}
openedFileCnt = 0;
return true;
}
} puts("输入的用户名不存在! "); return false;
}
string getCommand(char *&command) {
char *&c = command;
string cmd;
while (*c) {
if (*c == ' ' || *c == '\t') {
if (cmd.empty()) c++;
else break;
}
else cmd.push_back(*c++);
} return cmd;
}
void help() {
puts("可用命令: ");
puts("用户登录: login 用户名 ");
puts("切换用户: switch 用户名 ");
puts("创建文件: create 文件名 [-r|-rw] r:只读;rw:读写");
puts("删除文件: delete 文件名 ");
puts("打开文件: open 文件名");
puts("关闭文件: close 文件名");
puts("读文件: read 文件名 ");
puts("写文件: write 文件名 文件内容 ");
puts("文件列表: dir [-o] o:打开的文件列表");
puts("帮助: help");
puts("退出: exit");
}
int main() {
mfd.push_back(MFDItem("zhouhao"));
mfd.push_back(MFDItem("peter"));
mfd.push_back(MFDItem("ben"));
currentUser = mfd.end();
char buffer[100], *command;
string cmd, para;
help();
while (true) {
if (currentUser == mfd.end()) cout<<">>";
else cout<<currentUser->userName.c_str()<<">";
gets_s(buffer);
command = buffer;
if (!(cmd = getCommand(command)).empty()) {
if (cmd == "login") {
if ((cmd = getCommand(command)).empty()) {
puts("缺少用户名! "); continue;
} login(cmd);
}
else if (cmd == "switch") {
if ((cmd = getCommand(command)).empty()) {
puts("缺少用户名! "); continue;
}
currentUser = mfd.end(); login(cmd);
}
else if (cmd == "create") {
if ((cmd = getCommand(command)).empty()) {
puts("缺少文件名! "); continue;
}
bool readonly = false;
if (!(para = getCommand(command)).empty()) {
if (para == "-r") readonly = true;
}
createFile(cmd, readonly);
}
else if (cmd == "delete") {
if ((cmd = getCommand(command)).empty()) {
puts("缺少文件名! "); continue;
}
deleteFile(cmd);
}
else if (cmd == "open") {
if ((cmd = getCommand(command)).empty()) {
puts("缺少文件名! "); continue;
}
openFile(cmd);
}
else if (cmd == "close") {
if ((cmd = getCommand(command)).empty()) {
puts("缺少文件名! "); continue;
}
closeFile(cmd);
}
else if (cmd == "read") {
if ((cmd = getCommand(command)).empty()) {
puts("缺少文件名! "); continue;
}
readFile(cmd);
}
else if (cmd == "write") {
if ((cmd = getCommand(command)).empty()) {
puts("缺少文件名! "); continue;
}
if ((para = getCommand(command)).empty()) {
puts("缺少文件内容! "); continue;
}
writeFile(cmd, para);
}
else if (cmd == "dir") {
bool opened = false;
if (!(para = getCommand(command)).empty()) {
if (para == "-o") opened = true;
}
dir(opened);
}
else if (cmd == "help") help();
else if (cmd == "exit") break; else puts("输入的命令有误。 ");
}
}
return 0;
}
运行结果:
可用命令:
用户登录: login 用户名
切换用户: switch 用户名
创建文件: create 文件名 [-r|-rw] r:只读;rw:读写
删除文件: delete 文件名
打开文件: open 文件名
关闭文件: close 文件名
读文件: read 文件名
写文件: write 文件名 文件内容
文件列表: dir [-o] o:打开的文件列表
帮助: help
退出: exit
>>login ben
登录成功!
ben>switch zhouhao
登录成功!
zhouhao>create text.txt -rw
文件text.txt创建成功!
zhouhao>open text.txt
文件text.txt打开成功!
zhouhao>write text.txt 你好!
文件text.txt写入成功!
zhouhao>read text.txt
文件text.txt打开成功!文件内容为:你好!
zhouhao>close text.txt
文件text.txt关闭成功!
zhouhao>delete text.txt
文件text.txt删除成功!
zhouhao>exit
网友评论