2012-08-24 61 views
2

我正在使用此功能。 is_file和is_writable返回true,但是當我真的取消鏈接時,它會給出錯誤。這是在Windows服務器上。php文件是可寫的,但不能刪除

if(is_file($fileToDelete)) { 
    if(is_writable($fileToDelete)) { 
    unlink($fileToDelete); 
    } 
} 

該文件是一個PDF文檔,我已打開。我認爲is_writable在這種情況下會返回false,但它不會。

那麼如何判斷一個文件是否可以被刪除呢?

謝謝

+0

你有權限修改嗎?右鍵單擊它並檢查它的屬性 –

+0

在嘗試刪除它之前關閉文件 – Musa

+0

是的,因爲如果關閉文件,我可以從php中取消鏈接。 –

回答

4

這樣做反過來呢?試着刪除文件並檢查它是否真的沒有了?

@unlink($fileToDelete); 

if(is_file($fileToDelete)) { 
    // file was locked (or permissions error) 
} 

雖然不確定這是否適用於您的具體情況,但根據您的問題中的代碼判斷,這應該是您想要的。

+0

謝謝!這可能表明我的經驗不足,但是用@做一個函數調用的前綴是什麼?再次感謝,這工作。 –

+1

@ user1560676它可以消除錯誤。所以即使解除鏈接吐出錯誤也不會顯示。但請注意,只有幾種情況你應該使用'@',這是其中之一。另請參閱[這個問題](http://stackoverflow.com/questions/12053897/valid-use-cases-for-at-sign-in-php/12053971)關於它的使用。無論你做什麼,都不要把它當作銀彈來擺脫錯誤。 – PeeHaa

+1

@ user1560676 http://php.net/manual/en/language.operators.errorcontrol.php,它是錯誤抑制運算符。它告訴php忽略從該行派生的任何錯誤。一般來說,它使用它是不願意的,但也有一些像這樣的合法用途。 –

1

您使用的是檔案?我的意思是,你打開它做fopen($文件)?

嘗試刪除文件之前先執行fclose($ file)。

+0

豪爾赫 - 我沒有使用從PHP文件。這些是PDF文件,用戶在嘗試重新生成時可能會在其桌面上誤打開它們。這是我需要檢查...如果該文件是打開其他地方,不能被刪除的PHP。 –

0

對於他們不希望檢查之前刪除的文件誰,該解決方案是在這裏:

$file = "test.pdf"; 

if (!is_file($file)) { 
    print "File doesn't exist."; 
} else { 
    $fh = @fopen($file, "r+"); 
    if ($fh) { 
     print "File is not opened and seems able to be deleted."; 
     fclose($fh); 
    } else { 
     print "File seems to be opened somewhere and can't be deleted."; 
    } 
} 

簡單和高效。

+0

這很好,例如,如果你想讓用戶知道一個文件是否可以被刪除,然後給它們提供這個選項。好帖子。 –

相關問題