我正常打开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');
它让我这样做!无论如何,我可以确定文件是否未被其他程序打开?
答案 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 ++代码的情况下打开文件,以检测哪些程序具有文件的活动文件句柄。