【问题标题】:Does FAT disallow undirected cycles?FAT 是否不允许无向循环?
【发布时间】:2012-10-30 06:34:42
【问题描述】:

出于教育目的,我正在推出自己的 FAT 阅读器(允许您浏览驱动器等)。我当前的问题是确定当前的工作目录(例如典型命令提示符中的提示符)。据我所知,目录表没有提供有关您到达那里的路径的信息。 (我一直在按照我找到的here 的标准工作)因此,我目前的方法只是跟踪您通过的每个目录(即基本上每次使用cd <dir> 时,将该值放入列表中,然后删除使用cd ..时的最后一个)

这就是问题所在。假设两条不同的路径将您带到同一个目录。如果您随后向上跟踪.. 目录,则问题变得比仅从列表中删除最后一个目录名称更复杂。如果.. 带你走上你没有走的路,你实际上必须确定一个全新的工作目录。

如果 FAT 不允许无向循环,则此问题将变得无关紧要。 (我相信我读到某些文件系统不允许这种复杂性正是出于简化遍历的原因,但我找不到 FAT 的具体信息)我需要担心这个吗?换句话说,FAT是用树描述的还是用一般图描述的?

作为参考,我正在处理 FAT16 和 FAT32(顺便说一下在 Linux 上的 C 中,但我认为这无关紧要)

【问题讨论】:

    标签: graph tree operating-system cycle fat


    【解决方案1】:

    FATx 格式中没有任何内容不允许循环。但是,如果您允许循环,还有其他问题:

    • 正如所指出的,当两个目录条目指向同一个目录时,“..”是不明确的。通常没什么大不了的,因为 DOS/WINDOWS 维护目录的全文并且执行“cd ..”是名称操作,而不是目录遍历。 *NIX,另一方面会有问题。
    • 没有引用计数,这意味着 RMDIR X 无法有效释放磁盘空间,除非它执行整个树遍历以查看是否有对该目录的任何其他引用。
    • 更糟糕的是,可能会从根“断开”循环,留下 CHKDSK/fsck 需要清理的无法访问的空间。

    (注意,这些是 *NIX 不允许硬链接到目录的一些原因)。

    【讨论】:

      【解决方案2】:

      没关系,有两个父目录指向同一个子目录,因为在你的目录堆栈中没有这种二元性。当用户发出cd .. 命令时,只需弹出堆栈即可。

      【讨论】:

      • 假设 a/foo/b 将我们带到与 a/bar/b 相同的目录。我们向下遍历 a/foo/b,现在在 b 目录中。如果b点bar中的..文件,你是说我还应该回到foo吗?在那种情况下,我不知道要转到目录结构中的哪个位置,因为我没有在目录文件中使用 .. 给出的指针,所以我要么必须保存我曾经使用过的每个指针或者每次我使用 cd .. 时进行树搜索。
      • @Akroy 您在问题中说自己有一个列表,当您使用cd 命令时,您可以推送和弹出目录(实际上是一个堆栈)。因此,在您的程序中,如果您使用该堆栈而不是实际的父目录指针,则不会发生冲突。
      • 不,不是传统的堆栈,因为我想知道整个路径,而不仅仅是最近的目录。 (堆栈是 LIFO,所以你只能访问顶部,除非你基本上清空堆栈)并且使用该列表不会产生冲突,但它仍然是错误的。如果 .. 指的是一个目录,而我去别的地方,那是不对的。
      • 另外,知道目录的名称并不能说明它在驱动器上的位置。使用实际目录条目的要点是它有一个指向您应该去的磁盘位置的指针。
      【解决方案3】:

      四处询问,有经验的操作系统人员告诉我,FAT 没有明确禁止循环,但它会增加所有实现都忽略它的复杂性。毕竟,标准操作系统无法在没有位级黑客的情况下创建这样的循环。所以这个问题可以忽略。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        • 1970-01-01
        • 2020-12-27
        • 2017-05-13
        • 2018-07-16
        相关资源
        最近更新 更多