目录
注意:
修改read()和write()函数时需要修改2处地方(题目里面没给说明),
read()是2个print() 一个是child 一个是 next
write()是2个scanf() 也是一个是child 一个是 next
一、创建目录查看mkdir()函数,补全关键代码。
int mkdir()
{
// 初始化一个节点,节点名为空字符串,类型为目录(1表示目录)
temp = initnode(" ", 1);
scanf("%s", temp->filename);
// 如果当前节点(可能表示当前目录)没有子节点
if (recent->child == NULL)
{
temp->parent = recent;
temp->child = NULL;
recent->child = temp;
temp->prev = temp->next = NULL;
printf("目录建立成功!\n");
}
else
{
ttemp = recent->child;
// 如果第一个子节点的文件名与要创建的目录名相同且为目录类型
if (strcmp(ttemp->filename, temp->filename) == 0 && ttemp->isdir == 1)
{
printf("目录已存在!\n");
return 1;
}
// 遍历当前节点的子节点链表
while (ttemp->next)
{
ttemp = ttemp->next;
// 如果找到文件名相同且为目录类型的节点
if (strcmp(ttemp->filename, temp->filename) == 0 && ttemp->isdir == 1)
{
printf("目录已存在!\n");
return 1;
}
}
// 将新节点添加到链表末尾
ttemp->next = temp;
// 新节点的父节点设为NULL(这里可能是个错误,应该设置为recent)
temp->parent = NULL;
temp->child = NULL;
temp->prev = ttemp;
temp->next = NULL;
printf("目录建立成功!\n");
}
return 0;
}
二、创建文件查看create()函数,补全关键代码。
int create()
{
// 初始化一个节点,节点名为空字符串,类型为文件(0表示文件)
temp = initnode(" ", 0);
scanf("%s", temp->filename);
// 如果当前节点(可能表示当前目录)没有子节点
if (recent->child == NULL)
{
temp->parent = recent;
temp->child = NULL;
recent->child = temp;
temp->prev = temp->next = NULL;
printf("文件创建成功!\n");
}
else
{
ttemp = recent->child;
// 如果第一个子节点的文件名与要创建的文件相同且为文件类型
if (strcmp(ttemp->filename, temp->filename) == 0 && ttemp->isdir == 0)
{
printf("文件已存在!\n");
return 1;
}
// 遍历当前节点的子节点链表
while (ttemp->next)
{
ttemp = ttemp->next;
// 如果找到文件名相同且为文件类型的节点
if (strcmp(ttemp->filename, temp->filename) == 0 && ttemp->isdir == 0)
{
printf("文件已存在!\n");
return 1;
}
}
// 将新节点添加到链表末尾
ttemp->next = temp;
// 新节点的父节点设为NULL(这里可能是个错误,应该设置为recent)
temp->parent = NULL;
temp->child = NULL;
temp->prev = ttemp;
temp->next = NULL;
printf("文件建立成功!\n");
}
return 0;
}
三、写文件,读文件。查看read()函数,补全关键代码。
int read() {
char filename[FILENAME_LENGTH];
scanf("%s", filename);
if (recent->child == NULL) {
// 如果最近访问的节点的子节点为空,表示文件不存在
printf("文件不存在!\n");
return 1;
}
if (strcmp(recent->child->filename, filename) == 0) {
// 如果最近访问的节点的子节点的文件名与要查找的文件名相同
printf("%s\n", recent->child->content);
return 0;
} else {
temp = recent->child;
while (temp->next) {
if (strcmp(temp->next->filename, filename) == 0) {
// 如果下一个节点的文件名与要查找的文件名相同
printf("%s\n", temp->next->content);
return 0;
}
temp = temp->next;
}
printf("文件不存在!\n");
return 1;
}
}
四、删除文件查看del()函数,补全关键代码。
int del()
{
char filename[FILENAME_LENGTH];
scanf("%s", filename);
// 动态分配一个文件节点结构的内存空间
temp = (struct filenode *)malloc(sizeof(struct filenode));
// 如果当前节点(可能表示当前目录)有子节点
if (recent->child)
{
temp = recent->child;
// 在链表中查找要删除的文件节点,要求文件名匹配且不是目录(isdir!= 0表示是目录)
while (temp->next && (strcmp(temp->filename, filename)!= 0 || temp->isdir!= 0))
temp = temp->next;
// 如果没找到匹配的文件节点
if (strcmp(temp->filename, filename)!= 0 || temp->isdir!= 0)
{
printf("不存在该文件!\n");
return 0;
}
}
else
{
printf("不存在该文件!\n");
return 0;
}
if (temp->parent == NULL)
{
temp->prev->next = temp->next;
if (temp->next)
{
temp->next->prev = temp->prev;
}
temp->prev = temp->next = NULL;
}
else
{
if (temp->next)
{
temp->next->parent = temp->parent;
}
temp->parent->child = temp->next;
}
free(temp);
printf("文件已删除!\n");
return 0;
}
五、删除目录。查看rm()函数,补全关键代码
int rm()
{
char filename[FILENAME_LENGTH];
scanf("%s", filename);
temp = (struct filenode *)malloc(sizeof(struct filenode));
// 如果当前节点(可能表示当前目录)有子节点
if (recent->child)
{
temp = recent->child;
// 在链表中查找要删除的目录节点,要求文件名匹配且是目录(isdir == 1表示是目录)
while (temp->next && (strcmp(temp->filename, filename)!= 0 || temp->isdir!= 1))
temp = temp->next;
// 如果没找到匹配的目录节点
if (strcmp(temp->filename, filename)!= 0 || temp->isdir!= 1)
{
printf("不存在该目录!\n");
return 0;
}
}
else
{
printf("不存在该目录!\n");
return 0;
}
// 如果要删除的节点的父节点为空(特殊情况处理)
if (temp->parent == NULL)
{
temp->prev->next = temp->next;
if (temp->next)
{
temp->next->prev = temp->prev;
}
temp->prev = temp->next = NULL;
}
else
{
if (temp->next)
{
temp->next->parent = temp->parent;
}
temp->parent->child = temp->next;
}
free(temp);
printf("目录已删除!\n");
return 0;
}
六.写文件,write()函数,在文件中写数据。
int write() {
char filename[FILENAME_LENGTH];
scanf("%s", filename);
if (recent->child == NULL) {
// 如果最近访问的节点的子节点为空,表示文件不存在
printf("文件不存在!\n");
return 1;
}
if (strcmp(recent->child->filename, filename) == 0) {
scanf("%s", recent->child->content);
// 待补充
printf("文件写入成功!\n");
return 0;
} else {
temp = recent->child;
while (temp->next) {
if (strcmp(temp->next->filename, filename) == 0) {
scanf("%s", temp->next->content);
// 待补充
printf("文件写入成功!\n");
return 0;
}
temp = temp->next;
}
printf("文件不存在!\n");
return 1;
}
}
七.思考题
open()
-
功能描述:
open()
函数用于打开文件或目录,以便进行读写或其他操作。它通常返回一个文件描述符或句柄,这是一个用于在后续操作中引用打开文件的数值或引用。- 在文件系统中,
open()
可用于设置访问模式(如只读、只写或读写)、共享模式(如是否允许其他进程同时访问)以及其他属性(如同步或异步操作)。
-
与其他功能的关系:
- 在你的模拟系统中,
open()
可以在执行read()
或write()
之前被调用,以确保文件已经以适当的模式打开。 open()
可以与create()
函数关联,例如,在创建新文件后自动打开它进行写操作。- 用于跟踪文件是否已经打开,这样可以防止例如删除一个正在使用的文件(通过
del()
)。
- 在你的模拟系统中,
close()
-
功能描述:
close()
函数用于关闭已打开的文件或释放资源。这通常意味着操作系统可以将任何挂起的更改写回存储设备,并且该文件描述符或句柄被释放,可用于其他文件。- 正确使用
close()
是确保数据一致性和有效资源管理的关键。
-
与其他功能的关系:
- 应该在每次
read()
或write()
操作完成后调用close()
,以确保所有更改都已同步到文件系统,并且不会有文件描述符泄漏。 - 在文件或目录被删除之前(使用
del()
或rm()
),应确保该文件或目录已经被关闭,防止删除正在使用的文件。
- 应该在每次