用C语言写出如下要求的代码:采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读写保护。目录组织也可以不使用索引结点的方式。附带菜单栏,提供以下文件操作: 文件的创建: create 删除文件: delete 文件的打开: open 文件的关闭: close 文件的读: read 文件的写: write 显示文件目录:dir 退出: logout
时间: 2023-06-12 21:06:22 浏览: 58
```c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define MAX_USER 10 // 最大用户数
#define MAX_FILE 20 // 每个用户最大文件数
#define MAX_NAME_LEN 20 // 文件名最大长度
#define MAX_DIR_LEN 10 // 目录最大深度
#define MAX_PATH_LEN 100 // 文件路径最大长度
#define MAX_CONTENT_LEN 100 // 文件内容最大长度
typedef struct {
char username[MAX_NAME_LEN]; // 用户名
char password[MAX_NAME_LEN]; // 密码
int file_count; // 文件数目
char filenames[MAX_FILE][MAX_NAME_LEN]; // 文件名列表
char paths[MAX_FILE][MAX_PATH_LEN]; // 文件路径列表
} user_t;
typedef struct {
char filename[MAX_NAME_LEN]; // 文件名
char path[MAX_PATH_LEN]; // 文件路径
int address; // 物理地址
int length; // 长度
int read_protect; // 读保护
int write_protect; // 写保护
} file_t;
typedef struct {
char dirname[MAX_NAME_LEN]; // 目录名
int file_count; // 文件数目
file_t files[MAX_FILE]; // 文件列表
} dir_t;
user_t user_list[MAX_USER]; // 用户列表
int user_count = 0; // 用户数目
dir_t root_dir; // 根目录
dir_t* cur_dir; // 当前目录
int dir_depth = 0; // 当前目录深度
// 初始化系统
void init_system() {
// 初始化用户列表
user_count = 0;
memset(user_list, 0, sizeof(user_list));
// 初始化根目录
strcpy(root_dir.dirname, "/");
root_dir.file_count = 0;
memset(root_dir.files, 0, sizeof(root_dir.files));
// 初始化当前目录
cur_dir = &root_dir;
dir_depth = 0;
}
// 显示菜单
void show_menu() {
printf("\n");
printf("1. 创建文件\n");
printf("2. 删除文件\n");
printf("3. 打开文件\n");
printf("4. 关闭文件\n");
printf("5. 读取文件\n");
printf("6. 写入文件\n");
printf("7. 显示文件目录\n");
printf("8. 退出\n");
printf("\n");
}
// 查找用户
int find_user(char* username) {
int i;
for (i = 0; i < user_count; i++) {
if (strcmp(user_list[i].username, username) == 0) {
return i;
}
}
return -1;
}
// 创建用户
void create_user() {
if (user_count >= MAX_USER) {
printf("用户数目已达到最大值,无法创建新用户!\n");
return;
}
char username[MAX_NAME_LEN];
char password[MAX_NAME_LEN];
printf("请输入用户名:");
scanf("%s", username);
if (find_user(username) >= 0) {
printf("用户名已存在!\n");
return;
}
printf("请输入密码:");
scanf("%s", password);
user_t* new_user = &user_list[user_count];
strcpy(new_user->username, username);
strcpy(new_user->password, password);
new_user->file_count = 0;
memset(new_user->filenames, 0, sizeof(new_user->filenames));
memset(new_user->paths, 0, sizeof(new_user->paths));
user_count++;
printf("用户创建成功!\n");
}
// 删除用户
void delete_user() {
if (user_count == 0) {
printf("当前没有用户!\n");
return;
}
char username[MAX_NAME_LEN];
printf("请输入要删除的用户名:");
scanf("%s", username);
int user_idx = find_user(username);
if (user_idx < 0) {
printf("用户名不存在!\n");
return;
}
if (user_idx < user_count - 1) {
// 如果不是最后一个用户,将最后一个用户覆盖当前用户
user_list[user_idx] = user_list[user_count - 1];
}
user_count--;
printf("用户删除成功!\n");
}
// 登录
user_t* login() {
char username[MAX_NAME_LEN];
char password[MAX_NAME_LEN];
printf("请输入用户名:");
scanf("%s", username);
int user_idx = find_user(username);
if (user_idx < 0) {
printf("用户名不存在!\n");
return NULL;
}
printf("请输入密码:");
scanf("%s", password);
if (strcmp(user_list[user_idx].password, password) != 0) {
printf("密码错误!\n");
return NULL;
}
return &user_list[user_idx];
}
// 创建文件
void create_file(user_t* user) {
if (user->file_count >= MAX_FILE) {
printf("文件数目已达到最大值,无法创建新文件!\n");
return;
}
char filename[MAX_NAME_LEN];
printf("请输入文件名:");
scanf("%s", filename);
int i;
for (i = 0; i < user->file_count; i++) {
if (strcmp(user->filenames[i], filename) == 0) {
printf("文件名已存在!\n");
return;
}
}
file_t* new_file = &cur_dir->files[cur_dir->file_count];
strcpy(new_file->filename, filename);
sprintf(new_file->path, "%s/%s", cur_dir->dirname, filename);
new_file->address = rand() % 10000;
new_file->length = rand() % 1000;
new_file->read_protect = 0;
new_file->write_protect = 0;
user->file_count++;
strcpy(user->filenames[user->file_count - 1], filename);
strcpy(user->paths[user->file_count - 1], new_file->path);
cur_dir->file_count++;
printf("文件创建成功!\n");
}
// 删除文件
void delete_file(user_t* user) {
if (user->file_count == 0) {
printf("当前用户没有文件!\n");
return;
}
char filename[MAX_NAME_LEN];
printf("请输入要删除的文件名:");
scanf("%s", filename);
int i;
for (i = 0; i < user->file_count; i++) {
if (strcmp(user->filenames[i], filename) == 0) {
int j;
for (j = 0; j < cur_dir->file_count; j++) {
if (strcmp(cur_dir->files[j].filename, filename) == 0) {
if (j < cur_dir->file_count - 1) {
// 如果不是最后一个文件,将最后一个文件覆盖当前文件
cur_dir->files[j] = cur_dir->files[cur_dir->file_count - 1];
}
cur_dir->file_count--;
break;
}
}
if (i < user->file_count - 1) {
// 如果不是最后一个文件,将最后一个文件覆盖当前文件
strcpy(user->filenames[i], user->filenames[user->file_count - 1]);
strcpy(user->paths[i], user->paths[user->file_count - 1]);
}
user->file_count--;
printf("文件删除成功!\n");
return;
}
}
printf("文件不存在!\n");
}
// 打开文件
file_t* open_file(user_t* user) {
if (user->file_count == 0) {
printf("当前用户没有文件!\n");
return NULL;
}
char filename[MAX_NAME_LEN];
printf("请输入要打开的文件名:");
scanf("%s", filename);
int i;
for (i = 0; i < user->file_count; i++) {
if (strcmp(user->filenames[i], filename) == 0) {
int j;
for (j = 0; j < cur_dir->file_count; j++) {
if (strcmp(cur_dir->files[j].filename, filename) == 0) {
printf("文件打开成功!\n");
return &cur_dir->files[j];
}
}
printf("文件不存在!\n");
return NULL;
}
}
printf("文件不存在!\n");
return NULL;
}
// 关闭文件
void close_file(file_t* file) {
if (file == NULL) {
printf("没有打开的文件!\n");
return;
}
printf("文件已关闭!\n");
}
// 读取文件
void read_file(file_t* file) {
if (file == NULL) {
printf("没有打开的文件!\n");
return;
}
if (file->read_protect) {
printf("文件已被设置为只读!\n");
return;
}
char content[MAX_CONTENT_LEN];
int len;
printf("请输入要读取的内容:");
scanf("%s", content);
len = strlen(content);
if (len > file->length) {
printf("要写入的内容长度超过文件长度!\n");
return;
}
printf("读取成功!\n");
}
// 写入文件
void write_file(file_t* file) {
if (file == NULL) {
printf("没有打开的文件!\n");
return;
}
if (file->write_protect) {
printf("文件已被设置为只写!\n");
return;
}
char content[MAX_CONTENT_LEN];
int len;
printf("请输入要写入的内容:");
scanf("%s", content);
len = strlen(content);
if (len > file->length) {
printf("要写入的内容长度超过文件长度!\n");
return;
}
printf("写入成功!\n");
}
// 显示文件目录
void show_dir() {
printf("\n");
printf("%s\n", cur_dir->dirname);
int i;
for (i = 0; i < cur_dir->file_count; i++) {
printf(" %s\n", cur_dir->files[i].filename);
}
printf("\n");
}
// 退出
void logout() {
printf("已退出登录!\n");
}
int main() {
srand(time(NULL));
init_system();
while (1) {
printf("请输入用户名:");
char username[MAX_NAME_LEN];
scanf("%s", username);
user_t* user = login(username);
if (user == NULL) {
continue;
}
printf("欢迎使用文件系统,%s!\n", user->username);
while (1) {
show_menu();
int choice;
printf("请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
create_file(user);
break;
case 2:
delete_file(user);
break;
case 3:
open_file(user);
break;
case 4:
close_file(NULL);
break;
case 5:
read_file(NULL);
break;
case 6:
write_file(NULL);
break;
case 7:
show_dir();
break;
case 8:
logout();
break;
default:
printf("无效的操作编号!\n");
break;
}
if (choice == 8) {
break;
}
}
}
return 0;
}
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)