取消链接,但文件日期大小保持在新文件上


Unlink but file date size remains on new file

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

我试过以下方法;

unlink(DUMP_FILENAME); 
file_exists(DUMP_FILENAME);

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

file_put_contents(DUMP_FILENAME,$data,0); 

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

编辑:尝试从windows中删除文件,在PHP脚本运行后,文件上的日期仍然与windows删除之前一样!

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

从手册(第一条注释)中,我过去也注意到这一点。

unlink()不是关于删除文件,它是关于删除一个文件名到数据体。手册应该写:unlink -删除一个名称,可能还有它所指向的文件。

大多数情况下,一个文件只有一个名字——删除它也会删除(释放,释放)文件的"主体"。这是一个简单的,通常的情况。

但是一个文件的主体也可能被一个保持文件打开状态的进程保持活着(仍然使用磁盘空间)。

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

所以不使用filectime()来检查更改和创建,使用filemtime()

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

虽然这是令人惊讶的,但这通常是明智的做法,例如,当您保存更改时,文本编辑器中典型的事件序列是这样的,显然,文件的创建日期不应该仅仅因为您修改了它而改变。

可能的解决方案;

  • 创建具有唯一名称的新文件,然后将其移动到原始文件的顶部。它必须是一个真正的原子移动(即,用MOVEFILE_REPLACE_EXISTING调用MoveFileEx,或类似的操作),而不是删除旧文件并重命名新文件。

  • 自己显式设置创建日期(SetFileInformationByHandle)。同样,不知道PHP是否允许这样做。

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

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