对于remove
函数的行为,C99标准的措辞似乎有些含糊不清。
在第7.19.4.1节第2段:
remove
函数会导致名称为filename
指向的字符串的文件 不再可以通过该名称访问。随后尝试使用该文件打开该文件 名称将失败,除非它是重新创建的。
C99标准是否保证remove
函数删除文件系统上的文件,或者实现只是忽略文件 - 离开文件系统上的文件,但只是通过该文件名无法访问当前程序 - 对于程序的其余部分?
答案 0 :(得分:1)
C99标准不保证任何内容。
由于unlink(2)
可能失败的任何原因,文件可能会保留在那里。例如,您无权执行此操作。
请参阅http://linux.die.net/man/2/unlink以获取可能出错的示例。
答案 1 :(得分:1)
在Unix / Linux上,有几个原因导致文件无法删除:
remove()
将返回ERROR,当然)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将会这样做。如果您希望在程序中执行此操作,请打开要写入的文件,并在您要“删除”的内容上写下无意义的数据。