#include "尝试1.h"
//int flag = 0;
/*********************************************************************************************************************************/
//磁盘初始化
void i_disc()
{
for (int i = 0; i < discnumber; i++)
{
dnum[i].disc_f = 0;
for (int j = 0; j < 10; j++)
{
dnum[i].file_include[j] = { 0 };
dnum[i].file_name[j] = { 0 };
}
for (int j = 0; j < 16; j++)
{
dnum[i].root_user_name[j] = { 0 };
}
for (int j = 0; j < 8; j++)
{
dnum[i].root_user_hank[j] = { 0 };
}
dnum[i].next = NULL;
for (int j = 0; j < discnumber; j++)
{
dnum[i].file_table[j] = NULL;
}
dnum[i].root_exist = 0;
}
}
void disc_manage()
{
printf("位图:\n");
printf(" ");
for (int i = 0; i < discnumber; i++)
{
printf("%d ", dnum[i].disc_f);
if ((i + 1) % 10 == 0 && i != 0)
{
printf("\n");
printf(" ");
}
}
printf("\n");
}
/*********************************************************************************************************************************/
//注册
int input()//将用户注册的节点连上
{
Users* ptr;
p = getpch(Users);
p->hank = NULL;
p->num = 0;
p->flag = 0;
printf("请输入用户名:");
scanf("%s", p->name);
if (ready != NULL)
{
Users* pr = ready;
do
{
pr = pr->link;
if (strcmp(pr->name, p->name) == 0)
{
free(p);
return 0;
}
} while (pr->link != NULL);
}
printf("请输入密码:");
scanf("%s", p->password);
p->link = NULL;
if (ready == NULL)
{
ptr = getpch(Users);//创立头结点
ready = ptr;
first = ptr;
for (int i = 0; i < 16; i++)
{
ready->name[i] = { 0 };
ready->password[i] = { 0 };
}
}
first->link = p;
first = p;
first->link = NULL;
first->num = n;
n++;
return 1;
}
void registers()//注册
{
if (input() == 0)
{
printf("用户已存在!\n");
}
else
{
printf("用户名:%s\n", first->name);
printf("密码:%s\n", first->password);
printf("注册成功!\n");
}
}
/**********************************************************************************************************************/
//磁盘创建
int creat_hank(int m)
{
Hank* ptr = h[m];
if (last[m] == h[m])//建立磁盘
{
printf("当前未建立磁盘,请输入磁盘名称建立新磁盘:");
}
else
{
printf("请输入新磁盘名称:");
}
q[m] = getpch(Hank);
scanf("%s", q[m]->nameh);
while (ptr->link != NULL)
{
ptr = ptr->link;
//printf("ptr->name = %s\n", ptr->nameh);
if (strcmp(ptr->nameh, q[m]->nameh) == 0)
{
free(q[m]);
return 0;
}
}
last[m]->link = q[m];
last[m] = q[m];
last[m]->link = NULL;
return 1;
}
void create_newhank(int m)//磁盘创建
{
if (creat_hank(m) == 0)
{
printf("磁盘名称重复!\n");
}
else
{
printf("磁盘创建成功!\n");
printf("新磁盘为:%s\n", q[m]->nameh);
}
}
/*************************************************************************************************************************************/
//磁盘功能
void change_hank(int m)//更换磁盘
{
int flag = 0;
q[m] = h[m];
char sname[8] = { 0 };
printf("请输入盘符名称:");
scanf("%s", sname);
do
{
q[m] = q[m]->link;
if (strcmp(q[m]->nameh, sname) == 0)
{
printf("更改成功,当前磁盘是:%s\n", q[m]);
flag = 1;
break;
}
} while (q[m]->link != NULL);
if (flag == 0)
{
printf("未找到相应名称的磁盘!\n");
}
}
void search_hank(int m)//磁盘查询
{
Hank* k = q[m];
q[m] = h[m];
do
{
q[m] = q[m]->link;
printf("磁盘名称:%s\n", q[m]->nameh);
} while (q[m]->link != NULL);
q[m] = k;
}
/***********************************************************************************************************************/
//文件功能
//在结构体数组里做表,表指向块首地址 块和块直接由下标链接;
int search_root_disc(int m)//查找用户磁盘块
{
//printf("p->name = %s\n", p->name);
for (int i = 0; i < discnumber; i++)
{
//printf("q[m]->namehe = %s\n", q[m]->nameh);
//printf("dnum[i].root_user_hank = %s\n", dnum[i].root_user_hank);
//printf("dnum[i].root_user_name = %s\n", dnum[i].root_user_hank);
if (strcmp(p->name, dnum[i].root_user_name) == 0 && strcmp(q[m]->nameh, dnum[i].root_user_hank) == 0)//是此用户的当前磁盘块
{
if (dnum[i].root_exist == 1)//根目录存在
{
//printf("i = %d\n", i);
return i;
}
}
}
return -1;
}
int search_null_disc()//查找空的磁盘块
{
for (int i = 0; i < discnumber; i++)
{
if (dnum[i].disc_f == 0)
{
dnum[i].disc_f = 1;
return i;
}
}
}
int link_disc(int m)
{
int ptr = -1;
//printf("1234567890 m = %d", m);
ptr = search_root_disc(m);
//printf("ptr = %d\n", ptr);
if (ptr == -1)
{
ptr = 0;
ptr = search_null_disc();
dnum[ptr].root_exist = 1;
strcpy(dnum[ptr].root_user_hank, q[m]->nameh);
strcpy(dnum[ptr].root_user_name, p->name);
q[m]->search = &dnum[ptr];//search是指针所以赋值只能是地址,单纯从语法上看如果没有取址符q[m]->search = dnum也可
dnum[ptr].file_table[0] = &dnum[ptr];
}
//printf("dnum.[ptr].root_user_hank = %s\n", dnum[ptr].root_user_hank);
//printf("dnum.[ptr].root_user_name = %s\n", dnum[ptr].root_user_name);
//printf("dnum[ptr].root_exist = %d\n", dnum[ptr].root_exist);
return ptr;
}
void write_include(Disc* d,char numb[], int length)
{
if (length < 10)
{
strcpy(d->file_include, numb);
//printf("<10 = %s\n", d->file_include);
}
//d->file_include[i] = numb[i + 10];
if (length > 10)
{
for (int i = 0; i < 9; i++)
{
d->file_include[i] = numb[i];
// printf("<10 = %c\n", d->file_include[i]);
}
d->next = &dnum[search_null_disc()];
d = d->next;
d->disc_f = 1;
for (int i = 0; i < length - 9; i++)
{
d->file_include[i] = numb[i + 9];
//printf("<20 = %c\n", d->file_include[i]);
}
}
}
int search_disc(int ptr, char temporary_name[])
{
//printf("temporary_name = %s\n", temporary_name);
for (int i = 0; i < discnumber && dnum[ptr].file_table[i] != NULL; i++)
{
//printf("dnum[ptr].file_table[i]->file_name = %s\n", dnum[ptr].file_table[i]->file_name);
//printf("strcmp(dnum[ptr].file_table[i]->file_name, temporary_name) = %d\n", strcmp(dnum[ptr].file_table[i]->file_name, temporary_name));
if (strcmp(dnum[ptr].file_table[i]->file_name, temporary_name) == 0)
{
return i;
}
}
return -1;
/* for (int i = 0; i < discnumber; i++)
{
if (strcmp(dnum[i].file_name, temporary_name) == 0)
{
return i;
}
}
return -1;*/
}
int create_new_file(int ptr)
{
Disc* d;
int length = 0;
//int z = 0;测试
char temporary_name[10] = { 0 };
char temporary_include[20] = { 0 };
printf("请输入文件名称:");
scanf("%s", temporary_name);
printf("请输入文件内容:\n");
scanf("%s", temporary_include);
length = strlen(temporary_include);
//printf("ptr = %d\n", ptr);
//printf("dnum[ptr].root_exist = %d\n", dnum[ptr].root_exist);
if (search_disc(ptr, temporary_name) != -1)
{
printf("名称重复!");
return 0;
}
if (strlen(dnum[ptr].file_name) == 0 && dnum[ptr].root_exist == 1)//当前磁盘块没有存入
{
//printf("dnum[ptr].file_name = %s\n", dnum[ptr].file_name);
strcpy(dnum[ptr].file_name, temporary_name);
//printf("dnum[ptr].table[0]->file_name = %s\n", dnum[ptr].file_table[0]->file_name);
//printf("142dnum[ptr].file_name = %s\n", dnum[ptr].file_name);
if (length > 10)
{
/*strcpy(dnum[ptr].file_include, temporary_include);
dnum[ptr].next = &dnum[search_null_disc()];
d = dnum[ptr].next;
length -= 10;*/
d = &dnum[ptr];
d->disc_f = 1;
write_include(d, temporary_include, length);
}
else
{
d = &dnum[ptr];
d->disc_f = 1;
//strcpy(dnum[ptr].file_include, temporary_include);
write_include(d, temporary_include, length);
//printf("%s\n", dnum[ptr].file_include);
}
}
else
{
int i;
for (i = 0; i < discnumber; i++)
{
if (dnum[ptr].file_table[i] == NULL)
{
//z = i;
break;
}
}
dnum[ptr].file_table[i] = &dnum[search_null_disc()];
d = dnum[ptr].file_table[i];
strcpy(d->file_name, temporary_name);
// printf("d->name = %s\n", d->file_name);
//printf("dnum[ptr]->file_name = %s\n", dnum[ptr].file_table[z]->file_name);
write_include(d, temporary_include, length);
}
return 1;
}
void read_file(int ptr)
{
Disc* check;
char temporary_name[10] = { 0 };
printf("请输入文件名称:");
scanf("%s", temporary_name);
int i = search_disc(ptr, temporary_name);
//printf("i = %d\n", i);
if ( i != -1)
{
printf("文件查找成功!\n");
printf("文件名称是:%s\n", dnum[ptr].file_table[i]->file_name);
printf("文件内容是:");
check = dnum[ptr].file_table[i];
printf("%s", check->file_include);
while (check->next != NULL)
{
check = check->next;
printf("%s", check->file_include);
}
printf("\n");
}
else
{
printf("查找失败,请检查文件名是否正确!\n");
}
}
void write_file(int ptr)
{
Disc* check;
char temporary_name[10] = { 0 };
char temporary_include[19] = { 0 };//极端情况下假设file_inlcude存在且值为1
printf("请输入文件名称:");
scanf("%s", temporary_name);
int i = search_disc(ptr, temporary_name);
if (i != -1)
{
printf("请输入写入内容:\n");
scanf("%s", temporary_include);
int f = strlen(temporary_include);
check = dnum[ptr].file_table[i];
int w = strlen(check->file_include);
if (w == 10)
{
check = check->next;
w = strlen(check->file_include);
if (w + f < 10)
{
for (int i = 0; w + i < 10; i++)
{
check->file_include[w + i] = temporary_include[i];
}
}
else
{
printf("文件已满,无法写入\n");
}
}
else if (w < 10)
{
if (f <= (19 - w))
{
for (int i = 0; w + i < 10; i++)
{
//printf("check->file_include[w] = %c\n", check->file_include[w]);
//printf("int i = %d\n", i);
//printf("w = %d\n", w);
check->file_include[w + i] = temporary_include[i];
//printf("after check->file_include[w] = %c\n", check->file_include[w + i]);
}
//printf("check->file_clude = %s\n", check->file_include);
if (w + f > 10)
{
//printf("w + f = %d\n", (w + f));
Disc* m = check;
check->next = &dnum[search_null_disc()];
check = check->next;
// printf("check->file_include = %s\n", check->file_include);
for (int i = 0; i < (w + f - 10 + 1); i++)
{
check->file_include[i] = temporary_include[(10 - w) + i];
/*printf("9 - w + i = %d", ((9 - w) + i));
printf("temporary_include[(9 - w) + i] = %c\n", temporary_include[(9 - w) + i]);
printf("check->file_include[i] = %c\n", check->file_include[i]);*/
}
//printf("after for check->file_include = %s\n", check->file_include);
//printf("sum = %s\n", m->file_include);
}
}
else
{
printf("文件已满,无法写入\n");
}
}
}
else
{
printf("查找失败,请检查文件名是否正确!\n");
}
}
void public_delete_disc(int ptr, char temporary_name[])
{
Disc* del;
int i = search_disc(ptr, temporary_name);
// printf("temporary_name = %s\n", temporary_name);
if (i == -1)
{
printf("查找失败,请检查文件名是否正确!\n");
}
else
{
del = dnum[ptr].file_table[i];
printf("文件%s删除成功!\n", del->file_name);
for (int i = 0; i < 10; i++)
{
del->file_include[i] = { 0 };
del->file_name[i] = { 0 };
del->disc_f = 0;
}
if (del->next != NULL)
{
Disc* reserve;
reserve = del;
del = del->next;
for (int i = 0; i < 10; i++)
{
del->file_include[i] = { 0 };
del->disc_f = 0;
}
reserve->next = NULL;
}
//printf("删除成功!\n");
}
}
void del_disc(int ptr)
{
char temporary_name[10] = { 0 };
printf("请输入文件名称:");
scanf("%s", temporary_name);
public_delete_disc(ptr, temporary_name);
}
void population_disc(int m, int n)
{
int ptr;
ptr = link_disc(m);
//printf("根目录 = %d\n", ptr);
switch (n)
{
case 4: create_new_file(ptr); break;
case 5: read_file(ptr); break;
case 6: write_file(ptr); break;
case 7: del_disc(ptr); break;
default:
break;
}
}
/*********************************************************************************************************************/
//操作表
int user_hank_list(int m)
{
int n = 0;
printf("******************************************\n");
printf("** 磁盘 **\n");
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("** 9—退出 **\n");
printf("******************************************\n");
printf("当前的磁盘是:%s\n", q[m]->nameh);
printf("请输入指令:");
scanf("%d", &n);
switch (n)
{
case 1: create_newhank(m); return 1;
case 2: change_hank(m); return 2;
case 3: search_hank(m); return 3;
case 4: population_disc(m, n); return 4;
case 5: population_disc(m, n); return 5;
case 6: population_disc(m, n); return 6;
case 7: population_disc(m, n); return 7;
case 8: disc_manage(); return 8;
case 9: return 9;
default:
printf("输入错误");
return 9;
break;
}
}
/******************************************************************************************************************************************/
//用户与磁盘的链接
void user_hank(int m)//用户磁盘页面
{
if (p->flag == 0)
{
creat_hank(m);//进入盘的创建
p->flag = 1;
}
while (1)
{
if (user_hank_list(m) == 9)
{
break;
}
}
}
/******************************************************************************************************************************************/
//用户功能
int check(char strn[], char strp[])
{
int f1 = 1;
int f2 = 0;
p = ready;//因为头结点缘故,p第一次在空的头结点处
do
{
p = p->link;//先挪到下一个节点,再做比较 p是当前节点
f1 = strcmp(p->name, strn);
f2 = strcmp(p->password, strp);
//printf("p->name = %s\n", p->name);
if (f1 == 0 && f2 == 0)
{
printf("登陆成功!\n");
return 1;
}
}while (p->link != NULL);
if (f2 != 0)
{
if(f1 == 0)
{
printf("密码错误!\n");
}
else
{
printf("当前用户不存在!\n");
}
}
return 0;
}
void login()//登录
{
int m = 0;
if (ready == NULL)
{
printf("用户不存在!\n");
//system("pause");
//system("cls");
}
else
{
char strn[16] ={ 0 }, strp[16] ={ 0 };
printf("请输入用户名:");
scanf("%s", strn);
printf("请输入密码:");
scanf("%s", strp);
if (check(strn, strp) == 1)
{
m = p->num;
//printf("m = p->num = %d\n", m);
if (h[m] == NULL)//创建盘符链表的头结点
{
q[m] = getpch(Hank);
h[m] = q[m];
last[m] = q[m];
q[m]->link = NULL;
p->hank = h[m];
}
user_hank(m);
}
}
}
void change_user()//更换用户
{
login();
}
void search_user()//查询用户
{
if (ready != NULL)
{
p = ready;//因为头结点缘故,p第一次在空的头结点处
if (p->link != NULL)
{
do
{
p = p->link;//先挪到下一个节点,再做比较
printf("用户%s的密码是:%s\n", p->name, p->password);
} while (p->link != NULL);
}
}
else
{
printf("当前无用户,请重新添加!\n");
}
}
void del_user_node(Users* before)
{
for (int i = 0; i < 16; i++)
{
p->name[i] = { 0 };
p->password[i] = { 0 };
}
if (p == first)
{
first = before;
first->link = NULL;
free(p);
}
else
{
before->link = p->link;
p->link = NULL;
free(p);
}
if (first == ready)
{
free(ready);
ready = NULL;
first = NULL;
p = NULL;
}
}
void del_hank_disc(Hank* ptr, int m)
{
int number = link_disc(m);
//printf("m = %d\n", m);
for (int i = 0; dnum[number].file_table[i] != NULL; i++)
{
//printf("number = %d\n",number);
//printf("dnum[number].file_name = %s\n", dnum[number].file_name);
//printf("dnum[number].file_table[i]->file_name = %s\n", dnum[number].file_table[i]->file_name);
public_delete_disc(number, dnum[number].file_table[i]->file_name);
dnum[number].file_table[i] = NULL;
//printf("dnum[number].file_table[i] = %x", dnum[number].file_table[i]);
}
dnum[number].root_exist = 0;
for (int i = 0; i < 16; i++)
{
if (i < 8)
{
dnum[number].root_user_hank[i] = { 0 };
}
dnum[number].root_user_name[i] = { 0 };
}
}
void del_user_all()
{
Users* before;
Hank* ptr;
int del_flag = 0;
char temporary_root_usre_name[10] = { 0 };
printf("请输入删除用户的名称:");
scanf("%s", temporary_root_usre_name);
p = ready;
do
{
before = p;
p = p->link;
if (strcmp(p->name, temporary_root_usre_name) == 0)
{
del_flag = 1;
break;
}
} while (p->link != NULL);
if (del_flag != 1)
{
printf("用户名输入错误!\n");
}
else
{
int m;
m = p->num;
if (h[m] == NULL)
{
del_user_node(before);//没建立磁盘时
}
else///
{
while (last[m] != h[m])
{
q[m] = h[m];
//printf("last[m]->name = %s\n", last[m]->nameh);
if (q[m]->link != last[m])
{
do
{
q[m] = q[m]->link;
//printf("q[m]->name = %s\n", q[m]->nameh);
} while (q[m]->link != last[m]);//找到前一个节点
}
ptr = q[m];
q[m] = last[m];
last[m] = ptr;
ptr = q[m];
//printf("0 q[m]->nameh = %s\n", q[m]->nameh);//q和last反了
del_hank_disc(ptr, m);
q[m]->search = NULL;
free(q[m]);
}
free(h[m]);
p->hank = NULL;
del_user_node(before);
}
}
printf("删除成功!\n");
}
int list()
{
int n = 0;
printf("******************************************\n");
printf("** 二级文件管理模拟系统 **\n");
printf("** 请输入相应指令进行操作 **\n");
printf("** 1—新用户注册 **\n");
printf("** 2—用户登录 **\n");
printf("** 3—更换用户 **\n");
printf("** 4—查询用户 **\n");
printf("** 5—删除用户 **\n");
printf("** 6—退出 **\n");
printf("******************************************\n");
printf("请输入指令:");
scanf("%d", &n);
switch (n)
{
case 1: registers(); return 1;
case 2: login(); return 2;
case 3: change_user(); return 3;
case 4: search_user(); return 4;
case 5: del_user_all(); return 5;
case 6: return 6;
default:
printf("输入错误\n");
return 6;
break;
}
}
/*void search_all()//测试函数
{
printf("all\n");
for (int i = 0; i < discnumber; i++)
{
printf("dnum[i].disc_f = %d\n", dnum[i].disc_f);
printf("dnum[i].file_include = %s\n", dnum[i].file_include);
printf("dnum[i].file_name = %s\n", dnum[i].file_name);
printf("dnum[i].next = %x\n", dnum[i].next);
printf("dnum[i].root_exis = %d\n", dnum[i].root_exist);
printf("dnum[i].root_user_han = %s\n", dnum[i].root_user_hank);
printf("dnum[i].root_user_name = %s\n", dnum[i].root_user_name);
}
}*/
int main()
{
i_disc();
while (1)
{
if (list() == 6)
{
break;
}
}
//search_all();
}
操作系统实验三 文件管理
最新推荐文章于 2024-03-31 20:05:35 发布