2012-12-02 53 views
0

我用這樣的腳本:PHP - is_readable()返回不正確的值

$path = dirname(__FILE__)."/folder/file.ext" 
if(is_readable($path)){ 
    $file = fread(fopen($path,"r"), filesize($path)); 
}else{ 
    //do something else if file can't be opened 
} 

和令人驚訝地生成以下錯誤:

Warning: fread() [function.fread]: Length parameter must be greater than 0 
in /nfs/c10/h02/mnt/161920/domains/example.com/html/my-folder/file.php on line 16 

我不知道爲什麼會這樣。它只發生在一些服務器上,而其他服務器上則沒事。有什麼要求成功使用fread?文件存在於該位置。

+2

查找file_get_contents()而不是在讀取文件後不關閉文件的地方。 –

+2

您的'filesize($ path)'值爲0或小於零,通過打印來檢查該值。 –

回答

1

因爲每個人都有說,文件大小可能是0。

要麼使用file_get_contents的建議,或者如果你絕對要/需要使用fread(),你能避開它與PHP 5.3+以下內容:

$path = dirname(__FILE__)."/folder/file.ext" 
if(is_readable($path)){ 
    $file = fread(fopen($path,"r"), filesize($path) ?: 1); 
}else{ 
    //do something else if file can't be opened 
} 

請注意?: 1?它被稱爲ternary operator。也就是說,如果文件大小評估爲真(即大於0)或使用1,則使用文件大小。

絕對不是最佳實踐,但有趣的是要指出。

+0

太棒了:)非常感謝!現在我看到它發生了什麼,並感謝你這個'':'技巧。 – Atadj

+0

閱讀[PHP三元運營商](http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary),這是一個漂亮的功能! – jmlnik

+0

是的,我知道這一點 - 我經常使用這個,但是我會用'file_get_contents'去看是因爲'?:1'看起來像一些不安全的作弊((1)如果它是0就給文件1字節安全嗎?它可以可能會導致進一步的問題(2)爲什麼它有0?我的文件都沒有0 - 除非它試圖加載一些隱藏的文件,因爲我正在做'scandir',我只排除'.'和'..' ,(3)即使文件是空的 - 它不應該總是有一定的大小?)。 – Atadj

1

如果文件爲空,則可以讀取。但是您不能使用fread讀取0個字節。 0

爲了您的用例,你也可以使用PHP的file_get_contents功能

空文件==文件大小。

+0

太棒了:)非常感謝!現在我看到它正在發生什麼。 – Atadj