2011-08-03 45 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を実行しているので、大文字と小文字を区別する問題はありません。セーフモードはオフです。

.pngの1つがFTP経由でユーザーによってアップロードされ、.jpgの1つはスクリプトを使用してアップロードされます。しかし、私が知る限り、それは違いをもたらすべきではありません。

ヒント?

ありがとうございます。

+4

1つの単語:権限。 –

+0

私にとっては、相対パスではなく、絶対パスが必要なために終了しました。一部のPHP関数は、現在のファイル(parse_ini_file)に対する相対パスを受け入れます。 –

答えて

14

file_exists()の結果はキャッシュされているので、clearstatcache()を使用してください。それが助けにならなかったら、名前を再確認してください - それらは似ているかもしれませんが、同じではありません。

+0

これは本当に問題でした。それは、スクリプトが_のもので置き換えられたようです。お見逃しなく(と迷惑):| | – Bv202

+0

似たようなことが時々起こる:) – Timur

+3

私のためにclearstatcache() - 助けにはなりませんでしたが...私のクラス名はマルチメディアでした。その後、私はclearstatcache()を使用しました - まだ動作しませんでした。その後、私はMultimedia2にファイル名を変更しても助けにならなかった。それは奇妙だった。その後、ファイル名をAbcに変更しました。それは働いた...そして、マルチメディアに改名し、それは再び働いた:Dそれは約30分かかった... – instead

10

安全モードのためです。これを無効にするか、safe_mode_include_dirにディレクトリをインクルードすることができます。または、それらのファイルの所有権/許可を変更します。

php.net: file_exists()


php.net: safe mode

+0

セーフモードは既にオフになっているため、問題はありません。また、アクセス権はファイル固有である必要があります。両方が同じフォルダにあるためです。私はWindowsでこれらの問題を抱えたことはありませんが、アクセス許可を見ると、2つの違いはありません。 – 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

手入力を試してみましたか?また、あなたの2つの拡張が異なる場合には

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

ちょうど私の$ .02のように見える:私はこの問題を持っていたし、それは、ファイル名の末尾にスペースによるものでした。それは必ずしもパスの問題ではありません - それが私がチェックする最初のことですが - 常に。私は、ls -lコマンドを使ってファイル名をシェル・ウィンドウにカット・アンド・ペーストすることができました。もちろん、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、@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; 
} 
+0

で始まらないことを保証しました。あなたの 'custom_basename'関数宣言がありません –

+0

ありがとうchumkiu basename()はこの場合十分でしょう – RafaSashi

1

また、親フォルダやファイル自体の一つ上の許可問題になることがあります。

ウェブサーバーを実行しているユーザーとしてセッションを開き、そこにcdしてみます。フォルダはこのユーザーがアクセス可能でなければならず、ファイルは読み取り可能でなければなりません。

もしそうでなければ、phpはファイルが存在しないことを返します。

1

非常に簡単なトリックは私のために働いています。

次の行を書くと、falseを返します。

URL開始スラッシュを削除して書き込むと、trueを返します。

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

これはそうです私の夢のファイルがドライブのルートにないことを条件に、 /それの前に何もないのは根です。あなたの2番目の例は相対的です。 – 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']で使用するビットdiceyあるので、あなたはおそらく見ることができる7.0 + PHP 5.3をIISプロトコルを追加するための良い方法です

私はこの答えはここにhttp://php.net/manual/en/function.file-exists.php#75064

3

file_exists()だけでHTTPアドレスでは動作しません発見しました。 (あなたがPHP5を使用している場合、FTPと。)

は、それが唯一のファイルシステムのパスをサポート

注意してください。

が働いた:働いていない

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

私は最後の2時間をif文で間違っていると思っていました:file_exists($ file)がfしかし、問題なくinclude($ file)を呼び出すことができました。

それはこのように

など、is_file、私は.htaccessファイルに設定していたPHPのinclude_pathの値がfile_existsに引き継がなかったことを認識していなかったことが判明:

<?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を設定するなどの "シンプルさのためのショートカット"は、長期的にはもっと悲しみを引き起こすことができることを示しています。

関連する問題