1

我正在尝试在同一文件系统上的目录之间移动文件。我遇到的困难是,当我使用rename()文件系统上该文件的文件访问时间时发生了变化。

我尝试shell_exec()与 mv 一起使用,但由于某种原因,当我以这种方式调用 mv 时,它会复制文件然后删除原始文件,这需要更长的时间。

有什么方法可以在不改变访问时间的情况下快速移动文件?或者我可以打电话后改回来rename()吗?

4

2 回答 2

1

作为一般规则,当类似 的函数或访问文件的任何其他函数执行此操作时,必须更改文件的访问时间。rename()

至于更改文件的访问时间。这只能使用触摸功能,如手册中所述:

bool touch ( string $filename [, int $time = time() [, int $atime ]] )

尝试将 filename 参数中指定的文件的访问和修改时间设置为 time 中给定的值。请注意,无论参数数量如何,访问时间总是会被修改。

如您所见,时间参数在手册中描述为:

touch time

如果未提供时间,则使用当前系统时间。

这是同一页面中的一个示例,该示例将访问时间从文件设置为一小时后:

<?php
    // This is the touch time, we'll set it to one hour in the past.
    $time = time() - 3600;

    // Touch the file
    if (!touch('some_file.txt', $time)) {
        echo 'Whoops, something went wrong...';
    } else {
        echo 'Touched file with success';
    }
?>

但是,请注意,如上所述,触摸功能会尝试更改文件。例如,如果您没有权限,该函数将返回false. (并且不会更改文件时间)

干杯

于 2012-11-11T02:57:50.130 回答
1

您可以使用 临时存储文件的访问时间并使用fileatime对其进行修改touch

$filename = 'somefile.txt';
$original_timestamp = fileatime($filename);
// .. modify file here ..
touch($filename, $original_timestamp);
于 2012-11-11T03:02:24.720 回答