任何 OS 中的文件是否可能不在任何文件夹中?

Is it possible for a file in any OS to not be in any folder?

我正在为我的 A+ 考试学习,我想了解一下文件的存储方式。

我的理解是,在Windows中,所有文件的存储都从驱动器的根目录开始,无论是 C: 还是 D: 等...,但所有文件都在这些驱动器之一上, 在带字母的驱动器的子文件夹中或直接在 C: 或 D: 等中。

在macOS和Linux中,有一个根目录:“/”。所有大容量存储设备都由 OS 挂载为 / 的子文件夹,通常挂载到单个文件夹,在 Linux 中称为 /mount 或 /media,在 macOS 中称为 /Volumes。

如果这是真的,在这两种情况下,文件是否可以存储在文件夹之外?

我不能谈论 Windows,但在 unix-like 操作系统(macOS、Linux、BSD 等)和文件系统上,文件 sort-of 是可能的不存在于文件夹中。

在传统的 unix-like 文件系统中,目录本质上是一个文件名列表和保存实际文件的 inode 编号。同一个inode号可以在同一个目录的多个名字下的多个目录and/or中列出。这些目录条目在文件中称为“links”。您可以使用 ln 命令为文件创建附加目录条目 (links)。这是一个快速演示:

$ echo "This is a file" >afile.txt
$ ln afile.txt anotherlink.txt
$ ls -li
total 16
152165199 -rw-r--r--  2 gordon  staff  15 Feb 17 16:57 afile.txt
152165199 -rw-r--r--  2 gordon  staff  15 Feb 17 16:57 anotherlink.txt

这不是显示两个文件,而是显示两个目录条目,它们都引用同一个文件。请注意,inode 编号(显示是因为 ls-i 选项)是相同的,并且 link 计数(就在我的用户名之前)是 2.

如果您“删除”了一个文件(使用 rm 或类似的东西),它并不一定真的删除了文件。例如:

$ rm afile.txt
$ ls -li
total 8
152165199 -rw-r--r--  1 gordon  staff  15 Feb 17 16:57 anotherlink.txt
$ cat anotherlink.txt 
This is a file

请注意,一个目录条目已被删除,link 计数减少到 1,但文件仍然存在。

当您删除文件的最后一个目录条目时,link 计数将降为 0,文件实际上将被删除...除非它是打开的.直到 link 计数为零, 没有指向该文件的打开文件句柄,文件才真正被删除。下面是打开文件,unlinking,然后通过打开的文件句柄访问文件的演示:

$ exec 3<> anotherlink.txt   # Open the file on FD #3
$ rm anotherlink.txt 
$ cat /dev/fd/3
This is a file

...所以在这一点上,a 有一个文件 (inode #152165199) 仍然存在于磁盘上并且可以访问,但没有在任何目录中列出(因此很难访问,除非通过打开文件句柄)。

只要我关闭那个文件句柄,文件就会被删除。