我正在尝试覆盖Windows服务器上的文件。 文件内容确实被覆盖,但文件日期保持不变。
我尝试了以下内容;
unlink(DUMP_FILENAME);
file_exists(DUMP_FILENAME);
这会返回false,所以文件应该消失了,对吗?
file_put_contents(DUMP_FILENAME,$data,0);
文件获取新数据,但日期与unlnk()
之前的日期相同
为什么会这样?
编辑:尝试从Windows中删除文件,运行PHP脚本后文件上的日期仍然是Windows删除之前的日期!
我试图首先删除而不是仅覆盖的原因是我想要更改文件的日期。
答案 0 :(得分:2)
From the manual (First comment),我过去也注意到了这一点。
unlink()
不是关于删除文件,而是关于删除数据主体的文件名。该联机帮助页应该说:unlink - 删除一个名称,可能还有它所引用的文件。
大多数情况下,文件只有一个名称 - 删除它也会删除(释放,释放)`body'的文件。这是一个简单,通常的案例。
但文件的正文也可以保持活着' (仍然使用磁盘空间)由保持文件打开的进程。
所以基本上,只要进程保持打开状态,文件的主体(内容)就不会被释放(不会释放磁盘空间)。 (写入它的当前主题)
因此,不要使用filectime()
来检查更改和创建,而是使用filemtime()
。
答案 1 :(得分:1)
假设您指的是文件的创建日期,这是Windows文件系统的已知行为。如果删除,移动或重命名文件,然后重新创建它(在一段很短的时间内),它将神奇地继承先前的创建时间戳。
虽然这很令人惊讶,但这通常是明智之举,例如,当您保存更改时,这一系列事件对于文本编辑器来说是典型的,并且显然文件的创建日期不应仅因为您而改变已修改过它。
可能的解决方法;
使用唯一名称创建新文件,然后将其移到原始文件的顶部。它必须是真正的原子移动(即,使用MOVEFILE_REPLACE_EXISTING
调用MoveFileEx
或等效)而不是删除旧文件并重命名新文件。我不知道你是否可以用PHP做到这一点。
自己明确设置创建日期(SetFileInformationByHandle
)。再一次,不知道PHP是否允许你这样做。
在删除文件并重新创建文件之间等待足够长的时间。我不知道“足够长”多长时间,并且由于不可预测的原因,它可能在不同的Windows版本之间或甚至在Windows版本中有所不同,所以除非你能找到一些详细的文档,否则这样做可能是不可靠的。
不要打扰;在应用任何关心时间戳的逻辑时,请确保使用修改日期而不是创建日期。