2011-08-03 89 views
19

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

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,因此它与大小写敏感问题无关。安全模式关闭。

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

任何提示?

谢谢

+4

一个字:权限。 –

+0

对我来说,它最终成为因为它需要一个绝对路径,而不是相对路径。一些PHP函数接受相对于当前文件的路径,一个是parse_ini_file。 –

回答

14

file_exists()的结果进行了缓存,因此请尝试使用clearstatcache()。如果没有帮助,重新检查名称 - 它们可能相似,但不相同。

+0

这确实是个问题。这个脚本似乎用_s替代了_s。很难错过(和烦人):| – Bv202

+0

类似的事情发生有时:) – Timur

+3

对我来说clearstatcache() - 没有帮助,但...我的课程名称是多媒体。然后我用clearstatcache() - 仍然没有工作。然后我将文件重命名为Multimedia2没有帮助。这很奇怪。然后我将文件重命名为Abc。它的工作......然后重新命名为多媒体,它再次工作:D它花了我大约半小时...... – instead

10

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

php.net: file_exists()
php.net: safe mode

+0

安全模式已关闭,所以这不是问题。另外,权限应该是文件特定的,因为它们都在同一个文件夹中。我从来没有在Windows中遇到过这些问题,但是在查看权限时,我没有看到两者之间有什么区别... – Bv202

+0

啊,对不起,没有看到安全模式关闭。如果权限相同,则可能需要检查这些文件的所有者ID或组ID,这可能是因为您的Web用户不属于该组或不是该文件的所有者。 – ace

+0

请注意,safe_mode已在PHP 5.4.0中删除。 – Genjo

2

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

+0

它是'DIRECTORY_SEPARATOR'? –

+0

是的,它是@happy_marmoset。我纠正了答案。谢谢! – Doug

+2

'/'也可以在Windows上运行 – OverCoder

0

你有没有试过手动输入。还你的两个扩展似乎是在不同的情况下

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

只是我的$ .02:我只是有这个问题,它在文件名末尾的空间所致。这并不总是一个路径问题 - 尽管这是我检查的第一件事情 - 总是。我可以使用ls -l命令将文件名剪切并粘贴到shell窗口中,当然也可以找到该文件,因为命令行将忽略file_exists所不包含的空间。非常令人沮丧,几乎不可能找到它是不是为了StackOverflow。

提示:输出调试语句时,用分隔符()或[]括起数值,并且显示的空间非常清晰。并始终记住修剪你的输入。

+1

当然我会在*之后找到这个答案*我自己解决这个完全相同的问题! –

+0

最好使用trim()。每次都给我。 – Ligemer

8

我发现,什么工作对我来说,以检查文件是否存在(相对于它从当前执行的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... 
     } 
+1

我遇到了一个问题,解决它我确保路径没有开始'/' – Mohammad

0

一个custom_file_exists()函数的启发@Timur,@布赖恩,@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; 
} 
+0

你缺少'custom_basename'函数声明 –

+0

谢谢chumkiu basename()将在这种情况下足够 – RafaSashi

1

它也可以在父文件夹或文件本身的一个权限问题。

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

如果没有,php会返回文件不存在。

1

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

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

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

而当我用删除URL开始斜杠编写,然后它返回true。

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

这似乎是预计,只要my-dreams-files不在驱动器的根目录中。 /没有在它前面是根。你的第二个例子是相对的。 – conrad10781

0

这个答案可能有点哈克,但它一直为我工作 -

$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

3

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"; 
0

我花了最后两个小时想知道我的if语句有什么问题:file_exists($ file)返回f不过,我可以调用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一样,从长远来看可能会导致更多的悲伤。

相关问题