在读取时,我需要考虑任何锁定机制,以便在读取时没有人能够删除同一个文件。
为什么在Windows中显示不同的行为(例如,如果文件在某个编辑器中打开,则无法删除该文件)
- 在删除该文件后,如果我没有从vi编辑器中关闭文件,我如何仍然能够读取该文件。
我询问的是一般的文件,但是特定于平台,即Unix。如果我正在使用Java程序(缓冲读取器)读取文件,并且在读取时删除了文件,缓冲读取器是否仍能够读取下一块文件?
在读取时,我需要考虑任何锁定机制,以便在读取时没有人能够删除同一个文件。
为什么在Windows中显示不同的行为(例如,如果文件在某个编辑器中打开,则无法删除该文件)
我询问的是一般的文件,但是特定于平台,即Unix。如果我正在使用Java程序(缓冲读取器)读取文件,并且在读取时删除了文件,缓冲读取器是否仍能够读取下一块文件?
E211: File "filename" no longer available
这个警告不仅适用于Unix。如果您删除正在编辑的文件,Windows上的gvim也会给出此警告。它提醒您在退出之前保存您正在使用的版本,如果您不想丢失文件。
(注意:警告不会立即出现 - 只有在从编辑器切换到其他应用程序后再次回到编辑器时,vim才会检查原始文件是否存在。)
所以这是第一个问题,文本编辑器的行为 - 它们没有理由在整个会话中保持文件处于打开状态,因为除了启动和保存操作外,它们实际上并未使用该文件。
第二个问题,为什么一些Windows编辑器保持文件处于打开和锁定状态 - 我不知道,可能是Windows人太疯狂了。
第三个问题实际上与Unix有关,为什么删除文件后仍然可以访问打开的文件 - 这是最有趣的问题。直接呈现答案会让您感到震惊:
没有任何命令、函数、系统调用或其他方法实际上请求删除文件。
在rm
和任何其他可能看起来像删除文件的命令的基础上,都有一个名为unlink
的系统调用。它被称为unlink
,而不是remove
或deletefile
或类似的名称,因为它并没有删除文件。它删除了一个链接(也称为目录条目),该链接是文件和目录中名称之间的关联。(注意:ANSI C添加了remove
作为更通用的函数,以取悦那些没有意图实现Unix文件系统语义的非Unix用户,但在Unix上,如果目标是目录,则remove
只是rmdir
,对于其他一切则是unlink
。)
一个文件可以有多个链接(请参见如何使用ln
命令创建它们),这意味着相同的文件由多个名称知道。如果您删除其中之一,其他链接将保留,文件将不会被删除。当您删除最后一个链接时会发生什么?好吧,现在你有一个没有名称的文件。但是名称只是对文件的一种引用。还有至少两种其他引用文件的方式:文件描述符和mmap区域。当最后一个对文件的引用消失时,文件就被删除了。
由于引用以多种形式出现,因此许多事件都可能导致文件被删除。以下是一些示例:
我不会称之为完整的列表。我也不鼓励任何人尝试构建完整的列表。只需知道rm
是“删除名称”,而不是“删除文件”,文件在不再使用时就会消失。
如果您想立即销毁文件的内容,请截断它。所有已经使用它的进程将发现其大小突然变为0。(这在普通文件访问方法的情况下是破坏性的。为了更彻底地销毁它,以至于即使有人拥有原始磁盘访问权限也无法读取以前存在的内容,您需要覆盖它。有一个叫做shred
的工具可以实现这个功能。)
vi
),其内容将存储在内存中。同时,它可能会被删除,因此每次退出vi
时,它将从您的视线中消失。但是,如果您在vi
内部保存它:w
,那么它将被重新创建。 - fedorqui