PHP is_writeable或由另一个程序打开?

时间:2011-04-04 09:55:20

标签: php windows file

我正常打开Microsoft Access文件,我可以看到它被Micorsoft Office锁定。然后我尝试用PHP检查它是否可写:

echo '|--> '.is_writeable('C:\wamp\www\Database1.accdb');

但它返回1. Surley,它应该在打开时返回0?

为了测试,我接着尝试写信:

$fh = fopen('C:\wamp\www\Database1.accdb', 'w+');

fwrite($fh, 'hello');

它让我这样做!无论如何,我可以确定文件是否未被其他程序打开?

3 个答案:

答案 0 :(得分:1)

当你打开一个Microsoft文档,无论天气如何,它都是一个单词,power-point或access文件,应用程序将在标记为隐藏的同一目录中创建一个文件,这个文件告诉办公室应用程序该文件是什么使用

有问题的文件是 NOT 由操作系统锁定,因此操作系统无法确定MS应用程序打开文件的天气。

您需要做的是检查锁文件是否存在,然后这将允许您确定相关应用程序当前打开文档的天气。

类似的东西:

if(is_writeable("file.accdb") && !file_exists("file.lccdb"))
{
    touch("file.lccdb"); //mimic the file is being used

    /*
        * do Work
    */

    unlink("file.lccdb"); //Remove it
}

答案 1 :(得分:0)

您可以使用Access检查它是否已打开,因为(至少对于2007数据库)Access将具有“laccdb”扩展名的文件放在与数据库同名的同一文件夹中。显然,所有程序可能都不是这样。

如果只有可能打开它的程序是Access和你已经打开的程序,你可以确保每次打开它时,你也可以在同一目录中创建一个“database.laccdb”文件。同一时间,然后每次打开它检查以确保该文件不存在。我认为最好的方法是简单地检查锁文件是否存在,就好像它一样,然后它可能是打开的(除非上次使用它的程序忘记删除它,例如,意外关闭),如果它不是那里,那里不应该有任何程序从中读取。

答案 2 :(得分:0)

非MSAccess特定的答案是:

程序应该在文件打开时锁定,以便其他程序如果不想要这样的行为就无法写入文件。如果打开文件的程序无法执行此操作,则无法检测是否在未编写使用WinAPI函数的C / C ++代码的情况下打开文件,以检测哪些程序具有文件的活动文件句柄。