答案1
不,没有 Unix 系统调用来通过 inode(而不是通过名称)打开目录或文件。目录项在目录项列表中的位置的概念也不存在。
如果您认为自己想要这个,那么您可能在设计过程的早期某个地方就走错了方向。
如果有两个名为 的目录,那么会引用a
哪一个?a/file
目录条目是从名称到 inode 的无序映射,以名称为键。不支持重复键,也无法创建它们。任何使用已存在的名称执行任何操作的尝试都将仅引用现有的目录条目。
手动编辑磁盘上的数据结构(或内核错误或硬件错误)可能会产生两次同名的目录(甚至可能指向不同的索引节点),但这是一个fsck
需要检查的问题!
说你跑cat /home/peter/foo.txt
。 cat 根本不读取目录,它只是读取open("/home/peter/foo.txt", O_RDONLY) = -1 ENOENT (No such file or directory)
. (strace cat foo.txt
查看。)
或许可以使用保险丝呈现一个“文件系统”,它以某种奇怪的方式解释文件名中的特殊字符,并按具有某种意义的顺序返回目录条目。如果您同意对文件名中可以出现的字符进行限制,则可以为某些字符赋予特殊含义。所以/mnt/database-fuse-mount/some_dir/{2}
可以参考第二个目录条目。或者.../name{2}
可能参考名为 的第二个条目name
。我不希望有人实现过这个,除非可能有一个 FUSE 模块将数据库表安装为目录,每个记录都有一个文件。以文件名作为主键? IDK,这确实没有意义,因为 SQL 数据库可以通过其任何字段进行查询。
答案2
它不是磁盘上的文件系统,但任何数据库本质上都会做你想做的事情。它是一个抽象层,在文件管理器中作为一组目录和文件不可见,但如果您确实需要,您可以为自己编写一个基本的文件管理器。
使用数据库,您可以使用键值来区分“位置”,名称字段可以根据需要重复多次,并且您可以通过在表中查找匹配字段组合的查询来访问数据。