web-dev-qa-db-ja.com

file_exists()はfalseを返しますが、ファイルは存在します

File_exists()で非常に奇妙な問題が発生しています。この機能を使用して、同じフォルダー内に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を実行しているので、大文字と小文字が区別される問題とは関係ありません。セーフモードはオフです。

ただし、言及する価値があるのは、.pngファイルはユーザーがFTP経由でアップロードし、.jpgファイルはスクリプトを使用して作成されるということです。しかし、私が知る限り、それは違いをもたらすべきではありません。

任意のヒント?

ありがとう

31
Bv202

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

20
Timur

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";
15
Mahdi Loghmani

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

php.net:file_exists()
php.net:セーフモード

12
ace

ファイルが存在するかどうかを確認するのに役立つのは、ファイルが実行されている現在の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...
}
12
Shahar

ちょうど私の$ .02:私はちょうどこの問題を抱えていた、それはファイル名の末尾にスペースが原因でした。それは常にパスの問題ではありません-それが私がチェックする最初のものですが-常に。 ls -lコマンドを使用してシェルウィンドウにファイル名をカットアンドペーストできます。もちろん、コマンドラインはfile_existsではないスペースを無視するため、ファイルを検索します。 StackOverflowがなければ、非常にイライラし、見つけることはほぼ不可能でした。

ヒント:デバッグステートメントを出力するときは、値を区切り文字()または[]で囲みます。これにより、スペースがかなり明確に表示されます。そして、常に入力をトリミングすることを忘れないでください。

11
Brian

区切り文字として「/」の代わりにDIRECTORY_SEPARATORを使用してみてください。 Windowsは、LinuxおよびUnixシステムとは異なるファイルシステムパス(バックスラッシュ)の区切り文字を使用します。

2
Doug

親フォルダーの1つまたはファイル自体のアクセス許可の問題である可能性もあります。

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

そうでない場合、phpはファイルが存在しないことを返します。

1
Julien Ricard

とても簡単なトリックがここにあります。

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

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

そして、スラッシュを開始するURLを削除して書くと、trueを返します。

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

私はこれが起こる新しい理由があります-ローカルホストマシンにあるコードベースのマウントされたボリュームを持つDockerコンテナ内でPHPを使用しています.

私は_file_exists == FALSE_(inside Composer autoload)を取得していましたが、filepathを端末にコピーした場合-存在しました!clearstatche()、セーフモードがオフになっていることを確認しました。

それから、Dockerボリュームマッピングを思い出しました。ローカルホストマシン上の絶対パスは、Dockerコンテナー内には確かに存在しません。これは、PHPの世界観です。

(Dockerを使用していることを忘れてしまいます。これは、Dockerを実行するシェル関数を非常にうまく実行できるようにしたためです...)

1
scipilot

この答えは少しハッキーかもしれませんが、それは私のために働いています-

$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

0
kiko carisse

私はifステートメントの何が問題なのか疑問に思って最後の2時間を過ごしました:file_exists($file)はfalseを返していましたが、include($file)を問題なく呼び出すことができました。

include_pathファイルで設定したphp .htaccess値がfile_existsis_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を設定するような「単純化のためのショートカット」は、長い目で見ればもっと悲しみを引き起こすことができることを示します。

0
Irshad Khan

手動で入力してみましたか。また、2つの拡張機能は異なるケースにあるようです

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

@ Timur、@ Brian、@ Doug、@ Shaharの以前の回答に触発されたcustom_file_exists()関数:

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
RafaSashi