2012-12-02 50 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