2011-04-04 67 views
0

我打開Microsoft Access文件通常,我可以看到Micorsoft辦公室其鎖定。然後我試圖檢查其用PHP寫的:PHP is_writeable或被其他程序打開?

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

但它返回1 Surley,它應該打開的時候返回0?

只是爲了測試,然後我試圖寫它:

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

fwrite($fh, 'hello'); 

它讓我這樣做!無論如何,我可以確定一個文件是否被另一個程序打開?

+0

is_writable返回1當文檔存在,它是可寫的,如果fwrite的正確文檔中寫了什麼問題? – Awea 2011-04-04 09:58:23

+0

@Awea - 請閱讀問題的全面,即最後一行的問題。 – Abs 2011-04-04 10:46:32

回答

1

當您打開一個微軟的文檔,無論天氣的一個詞,電源點或訪問文件的應用程序將創建爲隱藏的標記在同一目錄下的文件,這個文件是什麼告訴的Office應用程序,該文件是正在使用。

有問題的文件是不是被操作系統鎖定,因此操作系統無法確定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 
} 
+0

啊,我明白了。我可以檢查訪問文件的內容,但如果給定一個包含各種文件的目錄,我該怎麼辦?是否有內置的PHP函數來檢查文件是否被打開?我猜測不,我必須設置規則來檢查鎖定文件。 – Abs 2011-04-04 10:49:21

+0

nope,你只能通過'C/C++/[C#+ pInvoke]查詢系統來查看打開的句柄'我相信,你最好的辦法是設置檢查鎖文件是否存在的規則。如果你的意思是各種訪問文件,那麼你的意思是什麼(如果給定一個包含各種文件的目錄*),那麼不用擔心,鎖文件是相對於db文件的,所以如果你的文件被稱爲'abs .accdb「,那麼鎖定文件將被稱爲'abs。lccdb'因此它使用相同的文件名,只是不同的擴展 – RobertPitt 2011-04-04 10:53:27

0

您可以檢查它是否使用Access打開,因爲(對於至少2007年的數據庫),Access將具有「laccdb」擴展名的文件放在與數據庫同名的同一文件夾中。顯然,所有程序可能都不是這種情況。

如果只有可能打開它的程序是Access和您已經創建的程序,則可以確保每次打開它時,還可以在同一目錄中同時創建一個「database.laccdb」文件,然後每次打開它時檢查以確保該文件不存在。我認爲最好的辦法是簡單地檢查鎖定文件是存在的,因爲如果是這樣,那麼它可能是開放的(除非最後用它忘記刪除它,例如,意外關閉,程序),如果它不是在那裏,那麼就不應該有任何程序讀取它。

0

非MSACCESS特定的答案是:

程序都應該當他們打開,從而使其它程序無法寫信給他們,如果他們不希望這樣的行爲來鎖定文件。如果打開該文件的程序不這樣做,你不能,如果它打開了文件,而無需編寫使用WinAPI的功能,以檢測程序有積極的文件句柄文件C/C++代碼檢測。

相關問題