//检查是否有空闲磁盘块 int j; for (j = USER_ROOT_STARTBLOCK + 1; j < DISK_NUM; j++) if (fat[j].state == 0) { fat[j].state = 1; break; }
时间: 2024-04-23 11:22:44 浏览: 13
这段代码的作用是检查磁盘是否还有空闲的磁盘块可以分配给新文件或目录。具体实现是从 USER_ROOT_STARTBLOCK + 1 开始遍历 FAT 表中的所有项,找到第一个 state 值为 0 的项,即为一个空闲的磁盘块。然后将该项的 state 值改为 1,表示该磁盘块已经被占用。如果遍历完所有的 FAT 表项,仍然没有找到空闲的磁盘块,则说明磁盘已经满了,无法再分配磁盘块,这时需要进行相应的提示并返回。
相关问题
for (j = 0; j < needDisk; j++) { for (i = USER_ROOT_STARTBLOCK + 1; i < DISK_NUM; i++) if (fat[i].state == 0) break; if (i >= DISK_NUM) { cout << "磁盘已被分配完!" << endl; return; } first = fdisk + i * DISK_SIZE;//空闲磁盘起始盘物理地址 //当写到最后一块磁盘,则只写剩余部分内容 if (j == needDisk - 1) { for (int k = 0; k < size - (DISK_SIZE - fSize % DISK_SIZE - j * DISK_SIZE); k++) first[k] = content[k]; } else { for (int k = 0; k < DISK_SIZE; k++) first[k] = content[k]; } //修改文件分配表内容 fat[item].item = i; fat[i].state = 1; fat[i].item = -1; }
这段代码的作用是将文件内容写入分配的磁盘块中。具体操作如下:
首先,通过一个外层循环,需要写入的磁盘块数为needDisk。循环次数就是需要写入的磁盘块数。
然后,通过一个内层循环,在所有磁盘块中找到第一个状态为0(即未分配)的磁盘块,并将其分配给文件使用。具体操作和上一个问题中的解释一样,不再赘述。分配后,获取该磁盘块的起始地址,即first = fdisk + i * DISK_SIZE。
接着,判断是否为最后一个磁盘块。如果是,则只写入剩余的部分内容,即size - (DISK_SIZE - fSize % DISK_SIZE - j * DISK_SIZE)。具体操作是,通过一个循环将剩余的内容逐个写入该磁盘块中。如果不是最后一个磁盘块,则将整个磁盘块中的内容全部写入。
然后,修改文件分配表中的信息。将当前磁盘块的盘块号记录在上一个磁盘块对应的项中,即fat[item].item = i;将当前磁盘块的状态设置为已分配,即fat[i].state = 1;将当前磁盘块对应的项设置为-1,表示该磁盘块是该文件的最后一个磁盘块,即fat[i].item = -1。
最终,该代码完成了文件内容的写入操作,将文件内容逐块写入已分配的磁盘块中。
int mkdir(string* str) { char fName[20]; strcpy(fName, str[1].c_str()); //检查目录名是否合法 if (!strcmp(fName, ""))return 0; if (str[1].length() > 10) { cout << "目录名太长!请重新输入!" << endl; return 0; } if (!strcmp(fName, ".") || !strcmp(fName, "..")) { cout << "目录名称不合法!" << endl; return 0; } //找当前目录下是否有目录重名 for (int pos = 2; pos < MSD + 2; pos++) { if (!strcmp(curDir->directItem[pos].fileName, fName)&&curDir->directItem[pos].type==1) { cout << "当前目录下已存在目录重名!" << endl; return 0; } } //检查当前目录下空间是否已满 int i; for (i = 2; i < MSD + 2; i++) if (curDir->directItem[i].firstDisk == -1)break; if (i >= MSD + 2) { cout << "当前目录下空间已满" << endl; return 0; } //检查是否有空闲磁盘块 int j; for (j = USER_ROOT_STARTBLOCK + 1; j < DISK_NUM; j++) if (fat[j].state == 0) { fat[j].state = 1; break; } if (j >= DISK_NUM) { cout << "无空闲盘块!" << endl; return 0; }
这段代码实现了一个创建目录的函数,它的功能是在当前目录下创建一个指定名称的子目录。函数中的参数是一个字符串指针,表示要创建的目录名称。函数首先检查目录名是否合法,如果目录名为空或者长度超过了限制,则输出提示信息并返回。接着检查当前目录下是否有目录名重复的情况,如果有则输出提示信息并返回。然后检查当前目录下空间是否已满,如果已满则输出提示信息并返回。接下来检查是否有空闲的磁盘块,如果没有则输出提示信息并返回。如果以上所有检查都通过了,则在当前目录下创建一个新的目录,并在文件分配表中分配一个新的磁盘块来保存该目录的内容。最后返回创建成功的标志。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.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)