取消链接但文件日期大小仍保留在新文件中

时间:2014-05-15 23:07:59

标签: php windows unlink

我正在尝试覆盖Windows服务器上的文件。 文件内容确实被覆盖,但文件日期保持不变。

我尝试了以下内容;

unlink(DUMP_FILENAME); 
file_exists(DUMP_FILENAME);

这会返回false,所以文件应该消失了,对吗?

file_put_contents(DUMP_FILENAME,$data,0); 

文件获取新数据,但日期与unlnk()之前的日期相同 为什么会这样?

编辑:尝试从Windows中删除文件,运行PHP脚本后文件上的日期仍然是Windows删除之前的日期!

我试图首先删除而不是仅覆盖的原因是我想要更改文件的日期。

2 个答案:

答案 0 :(得分:2)

From the manual (First comment),我过去也注意到了这一点。

unlink()不是关于删除文件,而是关于删除数据主体的文件名。该联机帮助页应该说:unlink - 删除一个名称,可能还有它所引用的文件。

大多数情况下,文件只有一个名称 - 删除它也会删除(释放,释放)`body'的文件。这是一个简单,通常的案例。

但文件的正文可以保持活着' (仍然使用磁盘空间)由保持文件打开的进程。

所以基本上,只要进程保持打开状态,文件的主体(内容)就不会被释放(不会释放磁盘空间)。 (写入它的当前主题)

因此,不要使用filectime()来检查更改和创建,而是使用filemtime()

答案 1 :(得分:1)

假设您指的是文件的创建日期,这是Windows文件系统的已知行为。如果删除,移动或重命名文件,然后重新创建它(在一段很短的时间内),它将神奇地继承先前的创建时间戳。

虽然这很令人惊讶,但这通常是明智之举,例如,当您保存更改时,这一系列事件对于文本编辑器来说是典型的,并且显然文件的创建日期不应仅因为您而改变已修改过它。

可能的解决方法;

  • 使用唯一名称创建新文件,然后将其移到原始文件的顶部。它必须是真正的原子移动(即,使用MOVEFILE_REPLACE_EXISTING调用MoveFileEx或等效)而不是删除旧文件并重命名新文件。我不知道你是否可以用PHP做到这一点。

  • 自己明确设置创建日期(SetFileInformationByHandle)。再一次,不知道PHP是否允许你这样做。

  • 在删除文件并重新创建文件之间等待足够长的时间。我不知道“足够长”多长时间,并且由于不可预测的原因,它可能在不同的Windows版本之间或甚至在Windows版本中有所不同,所以除非你能找到一些详细的文档,否则这样做可能是不可靠的。

  • 不要打扰;在应用任何关心时间戳的逻辑时,请确保使用修改日期而不是创建日期。