PHP在重命名之前检查文件是否已打开

时间:2013-07-11 08:37:30

标签: php

我有清理脚本,它将XLS文件从一个地方移动到另一个地方。对于这个文件移动过程,我使用了重命名功能。这个脚本运行正常。但是当XLS文件打开时,当我尝试移动那个xls时,我收到的错误只是说不能重命名sample.xls。但是我想在启动重命名功能之前添加像检查XLS打开的功能。

我相信这是函数调用flock,但这仅适用于TXT文件。

如何在调用重命名函数之前打开XLS文件。

3 个答案:

答案 0 :(得分:4)

您可以尝试的一件简单事情是使用 flock 获取文件的独占锁定,如果失败,您将知道该文件正在使用:

<?php
$fp = fopen('c:/your_file.xlsx', 'r+');
if(!flock($fp, LOCK_EX))
{
    echo 'File is being used...';
    exit(-1);
}
else
{
    fclose($fp);
    // rename(...);
}

另一种方法是检查在使用文件时通常会创建的excel锁定文件是否存在:

<?php
$file = 'c:/testfile.xlsx';
$lock = 'c:/~$testfile.xlsx';
if (file_exists($lock))
{
    echo "Excel $file is locked.";
}
else
{
    echo "Excel $file is free.";
}

隐藏文件通常是带有前缀~$的名称,对于旧的excel文件我认为2003年及更早版本的锁定文件保存在临时文件夹中,其名称为~DF7B32A4D388B5854C.TMP,因此它将是很难找到。

答案 1 :(得分:2)

您应该使用flock()。这会在文件上放置一个标志,以便通知其他脚本该文件正在使用中。该标志有意使用fclose或隐式地在脚本结束时关闭。

答案 2 :(得分:1)

使用文件锁,如:

flock($file,LOCK_EX);

请参阅this