-
可以实现常用文件目录和文件操作,比如:
login 用户登录
dir 列文件目录
create 创建文件
delete 删除文件
open 打开文件
close 关闭文件
read 读文件
write 写文件 -
在列文件目录时要列出文件名、物理地址、保护码和文件长度。
-
源文件可以进行读写保护。
#include<bits/stdc++.h>
class File {
public:
std::string name;
std::string content;
int address;
int protectionCode;
int length;
File()=default;
File(const std::string& name,int addr, int prot)
: name(name), address(addr), protectionCode(prot), length(0) {}
};
class Directory {
public:
std::string name;
std::map<std::string, File> files;
std::map<std::string,int> fileopen;
Directory(const std::string& n) : name(n) {}
Directory()=default;
void createFile(const std::string fileName, int protectionCode) {
int addr=0;
for(auto t: files)
{
addr=std::max(addr,t.second.address+t.second.length+1);
}
files[fileName] = File(fileName, addr, protectionCode);
}
void deleteFile(const std::string& fileName) {
files.erase(fileName);
fileopen.erase(name);
}
void open(const std::string name)
{
fileopen[name]=1;
}
void close(const std::string name)
{
fileopen[name]=0;
}
void read(const std::string name)
{
if(fileopen[name]==0)
{
std::cout<<"文件未打开\n";
return;
}
if(files[name].protectionCode>>1&1){
std::cout<<files[name].content<<std::endl;
}else
{
std::cout<<"无读取权限\n";
}
}
void write(const std::string name)
{
if(fileopen[name]==0)
{
std::cout<<"文件未打开\n";
return;
}
if(files[name].protectionCode&1) {
std::cout << "输入写入内容:\n";
getline(std::cin,files[name].content);
files[name].length=files[name].content.size();
}else
{
std::cout<<"无写入权限\n";
}
}
void listContents() const {
std::cout << "目录:" << name << "\n";
for (const auto& entry : files) {
const File& file = entry.second;
std::cout << "文件:" << file.name << " | 地址:" << file.address
<< " | 保护码:" << file.protectionCode << " | 长度:" << file.length << "\n";
}
}
};
class User {
public:
std::string username;
Directory homeDirectory;
User(const User &user)
{
username=user.username;
homeDirectory=user.homeDirectory;
}
User()=default;
User(const std::string& name) : username(name), homeDirectory(name) {}
};
class FileSystem {
public:
std::map<std::string, User> users;
User* currentUser;
FileSystem() : currentUser(nullptr) {}
void login(const std::string& username) {
if (users.find(username) != users.end()) {
currentUser = &users[username];
std::cout << "用户" << username << "登录成功\n";
} else {
std::cout << "用户" << username << "不存在\n";
}
}
void executeCommand(const std::string& command) {
std::istringstream iss(command);
std::vector<std::string> tokens{std::istream_iterator<std::string>{iss},
std::istream_iterator<std::string>{}};
if (tokens.empty()) {
return;
}
const std::string& cmd = tokens[0];
if (cmd == "login") {
if (tokens.size() ==2) {
login(tokens[1]);
} else {
std::cout << "登录: login <username>\n";
}
} else if (currentUser) {
if (cmd == "dir") {
currentUser->homeDirectory.listContents();
} else if (cmd == "create") {
if (tokens.size() ==3) { //cmd,filename,protection(11);
currentUser->homeDirectory.createFile(tokens[1], stoi(tokens[2]));
} else {
std::cout << "创建: create <filename> <protectCode>\n";
}
} else if (cmd == "delete") {
if (tokens.size() ==2) {
currentUser->homeDirectory.deleteFile(tokens[1]);
} else {
std::cout << "删除: delete <filename>\n";
}
} else if (cmd == "open") {
if (tokens.size() ==2) {
currentUser->homeDirectory.open(tokens[1]);
} else {
std::cout << "打开: open <filename>\n";
}
} else if (cmd == "close") {
if (tokens.size() ==2) {
currentUser->homeDirectory.close(tokens[1]);
} else {
std::cout << "关闭: open <filename>\n";
}
} else if (cmd == "read") {
if (tokens.size() ==2) {
currentUser->homeDirectory.read(tokens[1]);
} else {
std::cout << "读取: read <filename>\n";
}
} else if (cmd == "write") {
if (tokens.size() ==2) {
currentUser->homeDirectory.write(tokens[1]);
} else {
std::cout << "写入: write <filename>\n";
}
} else {
std::cout << "未知命令\n";
}
} else {
std::cout << "未登录\n";
}
}
};
int main() {
FileSystem fileSystem;
fileSystem.users["user1"] = User("user1");
fileSystem.users["user2"] = User("user2");
std::cout<<"输入用户名:";
std::string name;
std::cin>>name;
fileSystem.login(name);
while(true)
{
std::string cmd;
getline(std::cin,cmd);
fileSystem.executeCommand(cmd);
}
}