Graph 脂肪不允许无向循环吗?

Graph 脂肪不允许无向循环吗?,graph,tree,operating-system,cycle,fat,Graph,Tree,Operating System,Cycle,Fat,出于教育目的,我正在滚动我自己的胖阅读器(允许您浏览驱动器等)。我当前的问题是确定当前工作目录(例如典型命令提示符中的提示符)。据我所知,directory表没有给出您到达那里的路径信息。(我一直在使用我找到的标准)因此,我目前的方法是跟踪您通过的每个目录(即,基本上每次使用cd时,将该值放入列表中,并在使用cd..时删除最后一个目录) 这就是问题所在。假设两条不同的路径将您带到同一个目录。如果随后按照。目录向上移动,问题将变得比从列表中删除最后一个目录名更复杂。如果。将您带到未到达的路径,您实

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

这就是问题所在。假设两条不同的路径将您带到同一个目录。如果随后按照
目录向上移动,问题将变得比从列表中删除最后一个目录名更复杂。如果
将您带到未到达的路径,您实际上必须确定一个全新的工作目录

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


作为参考,我正在处理FAT16和FAT32(顺便说一句,在Linux上的C中,但我认为这是不相关的)

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

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

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

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

FATx格式中没有禁止循环的内容。但是,如果允许循环,还存在其他问题:

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

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

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

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

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

假设a/foo/B将我们带到与a/bar/B相同的目录。我们向下遍历a/foo/b,现在位于b目录中。如果。。文件在b点栏,你是说我还是应该回到foo?在这种情况下,我不知道目录结构中的哪个位置,因为我没有使用..给出的指针。。在目录文件中,所以我要么保留我曾经使用过的每个指针,要么每次使用cd时进行树搜索@Akroy您在问题中说过,当您使用
cd
命令时,您有一个列表,可以推送和弹出目录(实际上是一个堆栈)。因此,在程序中,如果使用该堆栈而不是实际的父目录指针,则不会发生冲突。不,不是传统堆栈,因为我想知道整个路径,而不仅仅是最近的目录。(堆栈是后进先出的,因此您只能访问顶部,除非您实际上清空了堆栈),使用该列表不会产生冲突,但仍然是错误的。如果。。引用一个目录,而我去了其他地方,这是不对的。而且,知道目录的名称并不能告诉它在驱动器上的位置。使用实际目录项的意义在于,它有一个指针,指向您应该在磁盘上的位置。我们向下遍历a/foo/b,现在位于b目录中。如果。。文件在b点栏,你是说我还是应该回到foo?在这种情况下,我不知道目录结构中的哪个位置,因为我没有使用..给出的指针。。在目录文件中,所以我要么保留我曾经使用过的每个指针,要么每次使用cd时进行树搜索@Akroy你在你的问题中说你有一张你需要的清单