一、目的、要求
1.使用编程语言C/C++/JAVA完成一个文件管理模拟系统的分析、设计和实施。通过课程设计掌握操作系统基础知识、Linux常用函数库的使用和应用程序的开发过程。
2.课程设计为学生提供了一个既动手又动脑,独立实践的机会,将教材上的理论知识和实践操作结合起来,锻炼学生分析解决问题的能力,提高学生实践编程能力。
3.培养学生在项目开发中团队合作精神、创新意识及能力。
二、主要内容
综合运用操作系统理论知识和编程知识设计实现一个文件管理模拟系统,该系统包含的基本信息:创建用户、登录用户、创建文件、删除文件、打开文件、显示文件、关闭文件等信息,能显示文件内容(50字符换行显示)、更改文件内容和更改文件名,并能修改文件的读写权限控制,支持查看文件的属性,主要包括:文件类型、文件长度、创建时间、文件权限等。
三、课程设计的目的与要求
1.使用编程语言C/C++/JAVA完成一个文件管理模拟系统的分析、设计和实施。通过课程设计掌握操作系统基础知识、Linux常用函数库的使用和应用程序的开发过程。
2.课程设计为学生提供了一个既动手又动脑,独立实践的机会,将教材上的理论知识和实践操作结合起来,锻炼学生分析解决问题的能力,提高学生实践编程能力。
3.培养学生在项目开发中团队合作精神、创新意识及能力。
四、设计正文
1.概述
1.1课程设计目的
1、掌握操作系统的基础知识并能熟练运用
2、熟悉Linux系统文件目录结构
1.2课程设计内容
- 通过掌握的操作系统的基础知识,利用c++来实现一个文件管理模拟系统。
- 利用学习过的linux来实现文件管理模拟系统的更加细致的实现。
- 与同组的同学一起在这次的课程设计中,通过学习来完成课程设计,将教材上的
2.系统需求分析
2.1系统目标
1、能够通过模拟文件管理系统,来实现创建用户,登录用户,创建文件,删除文件,打开文件,显示文件,关闭文件等信息,能显示文件内容,更改文件内容和更改文件名,并能够修改文件的读写权限控制的功能。支持查看文件的属性,主要属性包括:文件类型, 文件长度,创建时间,文件权限等
2.2主体功能
1、能够进行注册用户,登录用户,更改当前目录,创建子目录,删除子目录,显示当前目录的子目录,创建文件,删除文件,打开文件,关闭文件,读写文件,设置文件保护密码以及退出系统
2.3开发环境
操作系统:windows
开发语言:c
软件:dev-c++
3.系统总体设计
3.1系统的功能模块划分
本次的操作系统的课程设计只使用了一个cpp文件,在这个cpp文件中,创建了每一个功能的函数以及很多个结构体来实现信息的存储,并没有分文件编写,所以没有具体的模块划分。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<time.h>
using namespace std;
// 文件结构体
typedef struct file {
char* filename;
struct contentNode* contentHead;
time_t createtime;
bool flag = 0;
int size;
int permissions;
int length;
} file;
// 内容结点结构体
typedef struct contentNode {
char* content;
struct contentNode* next;
} contentNode;
// 用户结构体
typedef struct user {
char* username;
file* files[100];
int num_files;
} user;
// 函数声明
void create_user();
void delete_user();
int count_files();
void create_file(user* u);
void delete_file(user* u);
file* open_file(user* u);
void close_file(file* f);
void read_file(file* f);
void write_file(file* f);
void display_directory(user* u);
void display_file(user* u);
user* alter_user(user* u);
void initialize_users(int num_users);
void print_menu();
user users[100];
user* u;
int num_users = 0;
file* curFile;
int user_id;
int permission = 0;
// 创建用户
void create_user() {
if (num_users >= 100) {
printf("用户数已达上限\n");
return;
}
char newname[100];
printf("请输入新用户名:");
fgets(newname, 100, stdin);
newname[strcspn(newname, "\n")] = 0;
for (int i = 0; i < num_users; i++) {
if (strcmp(users[i].username, newname) == 0) {
printf("用户名已存在\n");
return;
}
}
users[num_users].username = strdup(newname);
num_users++;
printf("用户创建成功\n");
}
// 删除用户
void delete_user() {
char username[100];
printf("请输入要删除的用户名:");
fgets(username, 100, stdin);
username[strcspn(username, "\n")] = 0;
int index = -1;
for (int i = 0; i < num_users; i++) {
if (strcmp(users[i].username, username) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("用户不存在\n");
return;
}
free(users[index].username);
for (int i = index; i < num_users - 1; i++) {
users[i] = users[i + 1];
}
num_users--;
printf("用户删除成功\n");
}
// 统计文件数量
int count_files() {
int count = 0;
for (int i = 0; i < num_users; i++) {
count += users[i].num_files;
}
return count;
}
// 创建文件
void create_file(user* u) {
char newname[100];
printf("请输入要创建的文件名:");
fgets(newname, 100, stdin);
newname[strcspn(newname, "\n")] = 0;
for (int i = 0; i < u->num_files; i++) {
if (strcmp(u->files[i]->filename, newname) == 0) {
printf("文件已存在\n");
return;
}
}
file* f =(file*)malloc(sizeof(file));
f->filename = strdup(newname);
f->contentHead = NULL;
f->flag = false;
f->size = 0;
u->files[u->num_files++] = f;
printf("文件创建成功\n");
}
// 删除文件
void delete_file(user* u) {
char filename[100];
printf("请输入要删除的文件名:");
fgets(filename, 100, stdin);
filename[strcspn(filename, "\n")] = 0;
int index = -1;
for (int i = 0; i < u->num_files; i++) {
if (strcmp(u->files[i]->filename, filename) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("文件不存在\n");
return;
}
contentNode* current = u->files[index]->contentHead;
contentNode* temp;
while (current != NULL) {
temp = current;
current = current->next;
free(temp->content);
free(temp);
}
free(u->files[index]->filename);
free(u->files[index]);
for (int i = index; i < u->num_files - 1; i++) {
u->files[i] = u->files[i + 1];
}
u->num_files--;
printf("文件删除成功\n");
}
// 打开文件
file* open_file(user* u) {
char filename[100];
printf("请输入要打开的文件名:");
fgets(filename, 100, stdin);
filename[strcspn(filename, "\n")] = 0;
for (int i = 0; i < u->num_files; i++) {
if (strcmp(u->files[i]->filename, filename) == 0) {
u->files[i]->flag = true;
printf("文件打开成功\n");
return u->files[i];
}
}
printf("文件不存在\n");
return NULL;
}
// 关闭文件
void close_file(file* f) {
if (f->flag == false) {
printf("文件已经关闭\n");
return;
}
f->flag = false;
printf("文件关闭成功\n");
}
// 读文件
void read_file(file* f) {
if (f->flag == false) {
printf("文件还未打开,请先打开文件\n");
return;
}
if (f->contentHead == NULL) {
printf("文件为空\n");
return;
}
printf("文件内容为:\n");
contentNode* current = f->contentHead;
while (current != NULL) {
printf("%s", current->content);
current = current->next;
}
printf("\n");
}
// 写文件
void write_file(file* f) {
if (f->flag == false) {
printf("文件还未打开,请先打开文件\n");
return;
}
char content[1000];
printf("请输入要写入的内容:");
fgets(content, sizeof(content), stdin);
content[strcspn(content, "\n")] = 0;
contentNode* newNode = (contentNode*)malloc(sizeof(contentNode));
newNode->content = strdup(content);
newNode->next = NULL;
if (f->contentHead == NULL) {
f->contentHead = newNode;
} else {
contentNode* current = f->contentHead;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
f->size += strlen(content);
f->length = strlen(content);
printf("文件写入成功\n");
printf("文件大小为:%d",f->length);
}
// 显示用户的文件
void display_directory(user* u) {
printf("用户 %s 的文件列表:\n", u->username);
for (int i = 0; i < u->num_files; i++) {
printf("%s\n", u->files[i]->filename);
}
}
// 显示文件
void display_file(user* u) {
file* f = open_file(u);
if (f != NULL) {
read_file(f);
printf("文件大小为:%d\n", f->size);
close_file(f);
}
}
//更改文件内容
void modify_file_content(file* file, char* content) {
strcpy(file->contentHead->content, content);
file->length = strlen(content);
printf("文件内容修改成功!\n");
}
// 更改文件名
void modify_file_name(file* file, char* new_name) {
strcpy(file->filename, new_name);
printf("文件名修改成功!\n");
}
// 更改文件权限
void modify_file_permissions(file* file, int permissions) {
if (permissions == 0) {
printf("文件已设为只读!\n");
} else {
printf("文件已设为读写!\n");
}
file->permissions = permissions;
}
// 查看文件属性
void view_file_attributes(user* user,file* file) {
if(file == curFile)
{
printf("没有文件\n");
return;
}
printf("*****************************\n");
printf("*文件名:%s \n", file->filename);
printf("*文件类型:文本文件 \n");
printf("*文件大小:%d(byte) \n", file->length);
printf("*创建时间:%s \n", ctime(&file->createtime));
printf("*文件权限:%s \n", file->permissions == 0 ? "只读" : "读写");
printf("*****************************\n");
}
// 转换用户
user* alter_user(user* u) {
printf("请选择用户:\n");
for (int i = 0; i < num_users; i++) {
printf("%d. %s\n", i + 1, users[i].username);
}
scanf("%d", &user_id);
getchar(); // 清除缓冲区
u = &users[user_id - 1];
return u;
}
// 初始化用户
void initialize_users(int num_users) {
char str[10];
for (int i = 0; i < num_users; i++) {
printf("请为每个用户创建用户名:");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = 0; // 去除末尾换行
users[i].username = strdup(str);
}
}
// 打印菜单
void print_menu() {
printf("*************************************************\n");
printf("请选择操作选项:\n");
printf("1. 创建用户\t\t");
printf("2. 删除用户\t\t");
printf("3. 统计文件数量\n");
printf("4. 创建文件\t\t");
printf("5. 删除文件\t\t");
printf("6. 打开文件\n");
printf("7. 关闭文件\t\t");
printf("8. 读文件\t\t");
printf("9. 写文件\n");
printf("10. 更改文件内容\t\t");
printf("11. 更改文件名\t\t");
printf("12. 更改文件权限\n");
printf("13.显示目录\t\t");
printf("14.显示文件\t\t");
printf("15.切换用户\n");
printf("16.查看文件属性\t\t");
printf("17. 退出系统\n");
}
// 主函数
int main() {
// 初始化用户
printf("请确定用户数(1——100):");
scanf("%d", &num_users);
getchar(); // Clear input buffer
initialize_users(num_users);
// 选择用户
printf("请选择要登陆的用户:\n");
for (int i = 0; i < num_users; i++) {
printf("%d. %s\n", i + 1, users[i].username);
}
scanf("%d", &user_id);
getchar(); // Clear input buffer
u = &users[user_id - 1];
// 文件系统操作选择
int choice;
do {
print_menu();
scanf("%d", &choice);
getchar(); // Clear input buffer
switch (choice) {
case 1:
create_user();
break;
case 2:
delete_user();
break;
case 3:
printf("总文件数量:%d\n", count_files());
break;
case 4:
create_file(u);
break;
case 5:
delete_file(u);
break;
case 6:
curFile = open_file(u);
break;
case 7:
close_file(curFile);
break;
case 8:
read_file(curFile);
break;
case 9:
write_file(curFile);
break;
case 10:
{
char content[1000];
scanf("%[^\n]",content);
modify_file_content(curFile,content);
}
break;
case 11:
{
char new_name[50];
scanf("%s",new_name);
modify_file_name(curFile,new_name);
}
break;
case 12:
modify_file_permissions(curFile,permission);
break;
case 13:
display_directory(u);
continue;
case 14:
display_file(u);
break;
case 15:
u = alter_user(u);
break;
case 16:
{
view_file_attributes(u,curFile);
}
break;
case 17:
printf("退出文件系统\n");
break;
default:
printf("请输入1-17\n");
break;
}
} while (choice != 17);
return 0;
}