file_exists()返回false,但文件存在

我有一个非常奇怪的问题file_exists()。 我正在使用此function来检查是否存在2个不同的文件在同一个文件夹中。 我仔细检查过,他们都存在。

echo $relative . $url['path'] . '/' . $path['filename'] . '.jpg'; Result: ../../images/example/001-001.jpg echo $relative . $url['path'] . '/' . $path['filename'] . '.' . $path['extension']; Result: ../../images/example/001-001.PNG 

现在让我们在这些上使用file_exists():

 var_dump(file_exists($relative . $url['path'] . '/' . $path['filename'] . '.jpg')); Result: bool(false) var_dump(file_exists($relative . $url['path'] . '/' . $path['filename'] . '.' . $path['extension'])); Result: bool(true) 

我不明白 – 这两个文件确实存在。 我正在运行Windows,所以它不涉及一个区分大小写的问题。 安全模式closures。

可能值得一提的是,用户通过FTP上传了.png文件,而使用脚本创build了.jpg文件。 但据我所知,这不应该有所作为。

有小费吗?

谢谢

Solutions Collecting From Web of "file_exists()返回false,但文件存在"

file_exists()结果被缓存,所以请尝试使用clearstatcache() 。 如果没有帮助,重新检查名称 – 它们可能相似,但不相同。

这是因为安全模式。 您可以关闭它或在safe_mode_include_dir中包含目录。 或者更改这些文件的文件所有权/权限。

php.net:file_exists()
php.net:安全模式

我发现什么对我来说检查一个文件是否存在(相对于它正在执行的当前php文件)是这段代码:

  $filename = 'myfile.jpg'; $file_path_and_name = dirname(__FILE__) . DIRECTORY_SEPARATOR . "{$filename}"; if ( file_exists($file_path_and_name) ){ // file exists. Do some magic... } else { // file does not exists... } 

只是我的.02:我只是有这个问题,这是由于在文件名的末尾的空间。 这并不总是路径问题 – 尽管这是我首先检查的东西 – 总是。 我可以使用ls -l命令将文件名剪切并粘贴到shell窗口中,当然这也是定位文件的原因,因为命令行会忽略file_exists中没有的空间。 非常令人沮丧,几乎不可能找到它不是为了StackOverflow。

提示:输出调试语句时,用分隔符()或[]括起来的值将显示一个非常清晰的空格。 永远记得要修剪你的输入。

file_exists()只是不适用于HTTP地址。

它只支持文件系统路径(和FTP,如果你使用的是PHP5)。

请注意:

工作:

 if (file_exists($_SERVER['DOCUMENT_ROOT']."/folder/test.txt") echo "file exists"; 

没有工作:

 if (file_exists("www.mysite.com/folder/test.txt") echo "file exists"; 

尝试使用DIRECTORY_SEPARATOR而不是“/”作为分隔符。 Windows对文件系统路径(反斜杠)使用不同的分隔符,而不是Linux和Unix系统。

它也可能是其中一个父文件夹或文件本身的权限问题。

尝试打开一个会话作为用户运行您的Web服务器和CD到它。 该用户必须可以访问该文件夹,并且该文件必须是可读的。

如果没有,PHP将返回该文件不存在。

一个非常简单的技巧就是在这里为我工作。

当我写下面的行时,它会返回false。

 if(file_exists('/my-dreams-files/'.$_GET['article'].'.html')) 

而当我写入删除URL开始斜线,然后它返回true。

 if(file_exists('my-dreams-files/'.$_GET['article'].'.html')) 

你尝试过手动输入吗? 你的两个扩展似乎也是不一样的

  var_dump(file_exists('../../images/example/001-001.jpg')); var_dump(file_exists('../../images/example/001-001.PNG')); 

custom_file_exists()函数的灵感来自@Timur,@Brian,@Doug和@Shahar以前的答案:

 function custom_file_exists($file_path=''){ $file_exists=false; //clear cached results //clearstatcache(); //trim path $file_dir=trim(dirname($file_path)); //normalize path separator $file_dir=str_replace('/',DIRECTORY_SEPARATOR,$file_dir).DIRECTORY_SEPARATOR; //trim file name $file_name=trim(basename($file_path)); //rebuild path $file_path=$file_dir."{$file_name}"; //If you simply want to check that some file (not directory) exists, //and concerned about performance, try is_file() instead. //It seems like is_file() is almost 2x faster when a file exists //and about the same when it doesn't. $file_exists=is_file($file_path); //$file_exists=file_exists($file_path); return $file_exists; } 

这个答案可能有点冒失,但它一直在为我工作 –

 $file = 'path/to/file.jpg'; $file = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].'/'.$file; $file_headers = @get_headers($file); if($file_headers[0] == 'HTTP/1.1 404 Not Found') { $exists = false; }else{ $exists = true; } 

显然$_SERVER['REQUEST_SCHEME']IIS 7.0 + PHP 5.3中使用起来有点冒险,所以你可以找一个更好的方法来添加协议。

我在这里找到了这个答案http://php.net/manual/en/function.file-exists.php#75064

我花了最后两个小时想知道我的if语句有什么问题:file_exists($ file)返回false,但是我可以调用include($ file)没有问题。

事实证明,我没有意识到,在.htaccess文件中设置的php include_path值没有传递给file_exists,is_file等。

从而:

 <?PHP // .htaccess php_value include_path '/home/user/public_html/'; // includes lies in /home/user/public_html/includes/ //doesn't work, file_exists returns false if ( file_exists('includes/config.php') ) { include('includes/config.php'); } //does work, file_exists returns true if ( file_exists('/home/user/public_html/includes/config.php') ) { include('includes/config.php'); } ?> 

只是要表明,“简单的捷径”就像在.htaccess中设置include_path,从长远来看可能会导致更多的悲伤。