2011-08-03 117 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一樣,從長遠來看可能會導致更多的悲傷。

相關問題