文件系统函数详解:void create_file(char filename[], int length)
文件系统函数详解:void create_file(char filename[], int length) - 创建文件
本文将深入解析文件系统中的核心函数 create_file,该函数用于创建一个指定长度的文件。
void create_file(char filename[], int length) /* 创建文件 */
{
int i, j;
// 循环64次,查找是否有同名文件
for (i = 0; i < 64; i++)
{
if (strcmp(filename, c[i].file_name) == 0) // 如果找到同名文件
{
printf('文件已经存在,不允许建立重名的文件\n'); // 输出错误信息
return; // 返回
}
}
// 循环64次,查找空闲的目录项
for (i = 0; i < 64; i++)
{
if (c[i].i_num == -1) // 如果找到空闲的目录项
{
c[i].i_num = i; // 将目录项的i节点号设置为i
strcpy(c[i].file_name, filename); // 将文件名写入目录项
strcpy(c[i].dir_name, cur_dir); // 将当前目录名写入目录项
i_node[i].file_style = style; // 将文件类型写入i节点
i_node[i].file_length = length; // 将文件长度写入i节点
allot(length); // 分配盘块
// 循环length次,将盘块号写入i节点
for (j = 0; j < length; j++)
{
i_node[i].file_address[j] = physic[j];
}
break; // 跳出循环
}
}
}
代码解析:
-
文件名查重:
- 代码首先循环遍历目录项数组
c,比较文件名filename与每个目录项中存储的文件名c[i].file_name是否相同。 - 如果发现同名文件,则输出错误信息并返回,阻止创建重名文件。
- 代码首先循环遍历目录项数组
-
查找空闲目录项:
- 循环遍历目录项数组
c,寻找i_num属性为 -1 的空闲目录项。
- 循环遍历目录项数组
-
写入文件信息:
- 找到空闲目录项后,将文件信息写入目录项和 i 节点:
c[i].i_num: 设置目录项的 i 节点号c[i].file_name: 存储文件名c[i].dir_name: 存储当前目录名i_node[i].file_style: 设置文件类型i_node[i].file_length: 设置文件长度
-
分配磁盘空间:
- 调用
allot(length)函数分配指定长度的磁盘空间。
- 调用
-
更新 i 节点:
- 将分配到的磁盘块号依次写入 i 节点的
file_address数组中,记录文件的存储位置。
- 将分配到的磁盘块号依次写入 i 节点的
关于循环64次:
代码中出现两次循环64次的场景,这是因为该文件系统的设计设定最多只能容纳64个文件或目录。因此,在查找空闲目录项或同名文件时,只需要循环64次即可覆盖所有可能的情况。
总结:
create_file 函数是文件系统中创建文件的基础函数,它包含了文件名查重、空闲目录项查找、文件信息写入、磁盘空间分配等关键步骤,对于理解文件系统的底层运作机制至关重要。
原文地址: https://www.cveoy.top/t/topic/f2rZ 著作权归作者所有。请勿转载和采集!