删除功能是否可以保证删除文件?

时间:2013-08-07 16:31:00

标签: c c99 language-lawyer standard-library

对于remove函数的行为,C99标准的措辞似乎有些含糊不清。

第7.19.4.1节第2段:

  

remove 函数会导致名称为 filename 指向的字符串的文件   不再可以通过该名称访问。随后尝试使用该文件打开该文件   名称将失败,除非它是重新创建的。

C99标准是否保证remove函数删除文件系统上的文件,或者实现只是忽略文件 - 离开文件系统上的文件,但只是通过该文件名无法访问当前程序 - 对于程序的其余部分?

4 个答案:

答案 0 :(得分:1)

C99标准不保证任何内容。

由于unlink(2)可能失败的任何原因,文件可能会保留在那里。例如,您无权执行此操作。

请参阅http://linux.die.net/man/2/unlink以获取可能出错的示例。

答案 1 :(得分:1)

在Unix / Linux上,有几个原因导致文件无法删除:

  1. 你没有对文件目录的写权限(在这种情况下,remove()将返回ERROR,当然)
  2. 文件上还有另一个硬链接。然后该文件将保留在磁盘上,但只能由其他路径名访问
  3. 任何进程都会保持文件处于打开状态。在这种情况下,目录条目立即被删除,以便后续的open()不能访问该文件(或适当的调用将创建一个新文件),但只要任何进程保留它,文件本身将保留在磁盘上开。

答案 2 :(得分:1)

我认为C标准没有任何保证(N1570,7.21.4.1 2):

  

remove函数会导致名称为filename指向的字符串的文件   不再可以通过该名称访问。随后尝试使用该文件打开该文件   名称将失败,除非它是重新创建的。如果文件是打开的,则删除的行为   函数是实现定义的。

所以,如果你有一个病态实现,我认为它可以解释为调用remove()只会使文件对这个正在运行的程序实例不可见,但那将是正如我所说,病态。

但是,一切都不是完全愚蠢的! remove()的POSIX规范说,

  

如果path没有命名目录,则remove(path)应相当于unlink(path)。

     

如果路径为目录命名,则remove(path)应等同于rmdir(path)。

unlink()的POSIX文档非常明确:

  

unlink()函数应删除文件的链接。

因此,除非您的实现(a)符合POSIX要求,并且(b)极其病态,否则可以确保remove()函数实际上会尝试删除该文件,仅在文件实际被删除时才会返回0

当然,在当前使用的大多数文件系统上,文件名与实际文件分离,所以如果你有一个指向inode的五个链接,那么该文件将一直存在,直到你删除所有这五个文件。

<子>参考文献:

The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
The Open Group Base Specifications Issue 7, IEEE Std 1003.1™, 2013 Edition
注:“IEEE Std 1003.1 2004 Edition”是“IEEE Std 1003.1-2001,其中包括勘误表”。 “IEEE Std 1003.1 2013 Edition”是“IEEE Std 1003.1-2008,并附有勘误表”。

答案 3 :(得分:0)

通常,只将文件与文件系统取消链接。这意味着文件中的所有数据仍然存在。只要有足够的经验或时间,就有人能够获得这些数据。

有些选项可能无法再次读取文件。 * nix实用程序Shred将会这样做。如果您希望在程序中执行此操作,请打开要写入的文件,并在您要“删除”的内容上写下无意义的数据。