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

我通常打开一个Microsoft Access文件,我可以看到它被Micorsoft Officelocking。 然后我尝试检查它是否可用PHP写入:

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

但是它返回1. Surley,打开时应该返回一个0?

只是为了testing,然后我试图写信给它:

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

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

Solutions Collecting From Web of "PHP is_writeable或由另一个程序打开?"

当您打开Microsoft文档时,无论天气如何,电源点或访问文件,应用程序都会在标记为隐藏的同一目录中创建一个文件,该文件告诉办公应用程序该文件正在被使用。

有问题的文件被操作系统锁定,因此操作系统无法确定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 } 

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

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

非MSAccess特定的答案是:

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