1. 主页
  2. 自己动手从0到1学写FAT32文件系统
  3. 第3章 文件操作
  4. 实现文件定位

实现文件定位

内容纲要

本课程提供文件读写位置的设定功能接口。

主要内容

无论是向前调整位置,还是向后调整位置,在xfile_seek中都简化成统一的简单处理方式。

  • 向前调整offset > 0:只需顺着簇链继续往前移动位置即可。
  • 向后调整offset < 0:如果最终位置在同一簇内,直接设置;如果不在,从簇链的开头去遍历。

重点难点

注意事项

性能问题

正如对一个单链表的遍历一样,沿着链表向前移动是比较快的,并且也容易实现。

但是,如果向某个结点之前的某个结点的方向移动,直接操作是没有办法实现的。因为单链表中并没有保存前一结点的指针,所以为了定位某个结点的之前的结点,必须从链表的表头开始查找,然后定位到最终的结点。

在xfile_seek中,也存在类似的问题。

  • offset > 0时,实现简单,沿簇链往前访问即可。当然,调整的范围比较大时,需要跨过的簇就比较多,需要查找FAT表项的次数越多,导致读取扇区次数也越多。
  • offset < 0时,如果要从簇链开头遍历,开销也很大。特别是对于一个很大的文件,如果定位的位置在文件的末端,需要跨过的簇也比较多,需要查找FAT表项的次数越多,导致读取扇区次数也越多。

对于上述问题,有一种方案可解决,简而言之:将一个文件的所有簇链关系表保存到内存中。后续定位就直接在内容中去查,这样更快。

此方案在以后的课程扩展中,有可能会考虑实现。

常见问题

这篇文章对您有用吗?

我们要如何帮助您?

发表评论

电子邮件地址不会被公开。 必填项已用*标注