is_file

(PHP 4, PHP 5, PHP 7, PHP 8)

is_fileIndica si el nombre de fichero es un fichero normal

Descripción

is_file(string $filename): bool

Indica si el fichero dado es un fichero normal.

Parámetros

filename

Ruta del fichero.

Valores devueltos

Devuelve true si el nombre de fichero existe y es un fichero normal, false si no.

Nota: Debido a que el tipo integer de PHP es con signo y muchas plataformas usan enteros de 32 bits, algunas funciones de sistema de ficheros pueden devolver resultados inesperados para ficheros que son mayores de 2 GB.

Ejemplos

Ejemplo #1 Ejemplo de is_file()

<?php
var_dump
(is_file('un_fichero.txt')) . "\n";
var_dump(is_file('/usr/bin/')) . "\n";
?>

El resultado del ejemplo sería:

bool(true)
bool(false)

Errores/Excepciones

En caso de fallo, se emite un E_WARNING.

Notas

Nota: Los resultados de esta función son guardados en caché. Para más información ver clearstatcache().

Sugerencia

Desde PHP 5.0.0, esta función también puede usarse con algunos URL wrappers. Consultar Protocolos y Envolturas soportados para deter4minar qué envolturas soportan la familia de funcionalidad de stat().

Ver también

  • is_dir() - Indica si el nombre de archivo es un directorio
  • is_link() - Indica si el nombre de archivo es un enlace simbólico

add a note add a note

User Contributed Notes 23 notes

up
51
Anonymous
12 years ago
Note that is_file() returns false if the parent directory doesn't have +x set for you; this make sense, but other functions such as readdir() don't seem to have this limitation. The end result is that you can loop through a directory's files but is_file() will always fail.
up
9
Anonymous
19 years ago
### Symbolic links are resolved ###

If you pass a symlink (unix symbolic link) as parameter, is_file will resolve the symlink and will give information about the refered file. For example:

  touch file
  ln -s file link
  echo '<? if (is_file("link")) echo "y\n"; ?>' | php -q

will print "y".

is_dir resolves symlinks too.
up
8
andreas dot stagl at fits dot at
21 years ago
if you're running apache as a service on a win32 machine, an you try to determinate if a file on an other pc in your network exists - ex.: is_file('//servername/share/dir1/dir2/file.txt') - you may return false when you're running the service as LocalSystem. To avoid this, you have to start the Apache-Service as a 'registered' domain user.
up
7
ludvig dot ericson at gmail dot com
19 years ago
I tend to use alot of includes, and I found that the is_file is based on the script executed, not ran.
if you request /foo.php and foo.php looks like this:
<?php
include('foobar/bar.php');
?>
and bar.php looks like this:
<?php
echo (is_file('foo/bar.txt'));
?>

Then PHP (on win32, php 5.x) would look for /foo/bar.txt and not /foobar/foo/bar.txt.
you would have to rewrite the is_file statement for that, or change working directory.
Noting this since I sat with the problem for some time,

cheers, Toxik.
up
4
gizmo at gizmo dot sk
16 years ago
here is a workaround for the file size limit. uses bash file testing operator, so it may be changed to test directories etc.  (see http://tldp.org/LDP/abs/html/fto.html for possible test operators)

<?php
function is_file_lfs($path){
   
exec('[ -f "'.$path.'" ]', $tmp, $ret);
    return
$ret == 0;
}
?>
up
6
cristian dot ban at neobytesolutions com
16 years ago
regarding note from rehfeld dot us :

In my experience the best( and easiest ) way to find the extension of a file is :

<?php

// use this when you are sure it actually has an extension.
$extension = end(explode(".", $file_name));

?>

or

<?php

// this one will also check if it actually has an extension
$parts = explode(".", $file_name);
if (
is_array($parts) && count($parts) > 1)
   
$extension = end($parts);

?>
up
3
quietust at ircN dot org
22 years ago
In PHP 4.1.0 under win32, this seems to print out a warning message if the file does not exist (using error_reporting = E_ALL & ~E_NOTICE).
up
5
Anonymous
12 years ago
is_file doesn't recognize files whose filenames contain strange characters like czech ů or russian characters in general.

I've seen many scripts that take it for granted that a path is a directory when it fails is_file($path). When trying to determine whether a path links to a file or a dir, you should always use is_dir after getting false from is_file($path). For cases like described above, both will fail.
up
5
www.ip4t.net - abdelrahman nourallah
8 years ago
sometimes this function does not work because permission ,

you can use this function that check if the path has dot in last will return true .

public function isFile($file) {
        $f = pathinfo($file, PATHINFO_EXTENSION);
        return (strlen($f) > 0) ? true : false;
    }
 
isfile('http://www.ip4t.net/image.jpg');

you should replace a string between '' with your file path to check
up
4
rigrace at swbell dot net
15 years ago
It took me a day or so to figure out that is_file() actually looks for a valid $ existing path/file in string form. It is not performing a pattern-like test on the parameter given. Its testing to see if the given parameter leads to a specific  existing 'name.ext' or other (non-directory) file type object.
up
2
Jonathan Shaltz
18 years ago
Maybe this is a newbie mistake, but note that paths are relative to the filesystem and the location of the script.  This means that MS IIS virtual directories are not available by relative path - use an absolute.
This threw me because virtual directories ARE available for URLs, at least on IIS.
up
2
bill fumerola
18 years ago
be careful, is_file() fails on files larger than your integer storage (2^32 for most).

Warning: is_file(): Stat failed for bigfile (errno=75 - Value too large for defined data type)
up
3
Kevin Gregull
15 years ago
This Function deletes everything in a defined Folder:
Works with PHP 4 and 5.

<?php
 
function deletefolder($path)
  {
    if (
$handle=opendir($path))
    {
      while (
false!==($file=readdir($handle)))
      {
        if (
$file<>"." AND $file<>"..")
        {
          if (
is_file($path.'/'.$file))
          {
            @
unlink($path.'/'.$file);
          }
          if (
is_dir($path.'/'.$file))
          {
           
deletefolder($path.'/'.$file);
            @
rmdir($path.'/'.$file);
          }
        }
      }
    }
  }
?>
up
2
don dot duvall at deduvall dot com
14 years ago
I have noticed that using is_file on windows servers (mainly for development) to use a full path c:\ doesn't always work.

I have had to use
C:/foldertowww/site/file.ext

so I preform an str_replace('\\', '/', $path)
Sometimes I have had the \ instead of / work. (this is using apache2 on XP)

but for sure you cannot have mixed separators.
up
-1
tatarynowicz at gmail dot com
17 years ago
An easy way not to have to choose between hard-coding full paths and using relative paths is either via this line:

<?php
// in the bootstrap file
define('DIR_ROOT', dirname(__FILE__));
// in other files, prefix paths with the constant
require(DIR_ROOT . '/relative/to/bootstrap.php');
?>

or if you have to use a relative path:

<?php
require(dirname(__FILE__) . '/relative/to/this_file.php');
?>

This way all your paths will be absolute, yet you can move the application anywhere in the filesystem.

BTW, each successive call to dirname takes you one step up in the directory tree.

<?php
echo __FILE__;
// /www/site.com/public/index.php
echo dirname(__FILE__);
// /www/site.com/public
echo dirname(dirname(__FILE__));
// /www/site.com
?>
up
-2
sy well-known-sign damla.net
15 years ago
In 32 bit environments, these functions including is_file(), stat() filesize() will not work due to PHPs default integer being signed. So anything above ~2.1 billion bytes you actually get a negative value.

This is actually a bug but I dont think there is an easy workaround. Try to switch to 64 bit.
up
-5
ca dot redwood at gmail dot com
14 years ago
this is a simple way to find specific files instead of using is_file().
this example is made for mac standards, but easily changed for pc.

<?php
function isfile($file){
    return
preg_match('/^[^.^:^?^\-][^:^?]*\.(?i)' . getexts() . '$/',$file);
   
//first character cannot be . : ? - subsequent characters can't be a : ?
    //then a . character and must end with one of your extentions
    //getexts() can be replaced with your extentions pattern
}

function
getexts(){
   
//list acceptable file extensions here
   
return '(app|avi|doc|docx|exe|ico|mid|midi|mov|mp3|
                 mpg|mpeg|pdf|psd|qt|ra|ram|rm|rtf|txt|wav|word|xls)'
;
}

echo
isfile('/Users/YourUserName/Sites/index.html');
?>
up
-3
sarken at free dot fr
10 years ago
I see, is_file not work properly on specifical file in /dev (linux)
look :

root@boofh:/data# php -r "var_dump(is_file('/dev/core'));"
bool(true)
root@boofh:/data# php -r "var_dump(is_file('/proc/kcore'));"
bool(true)

root@boofh:/data# ls -alh /proc/kcore
-r-------- 1 root root 128T Aug 13 18:39 /proc/kcore

OR FIND do not detect regular file.
root@boofh:/data# find /dev/ -type f
root@boofh:/data#

// version of php :
root@boofh:/data# php -v
PHP 5.4.4-14+deb7u3 (cli) (built: Jul 17 2013 14:54:08)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
up
-4
rlh at d8acom dot com
21 years ago
I do a lot of file parsing and have found the following technique extremely useful:

while (false !== ($document = readdir($my_dir)))
{
    $ext=explode('.',$document);
    if($document != '.' && $document != '..' && $ext[1])
    {
                       'Do something to file...'
              }
}

It gets around the fact that, when working on website pages, the html files are read as directories when downloaded. It also allows you to extend the usefulness of the above method by adding the ability to determine file types e.g.

if($document != '.' && $document != '..' && $ext[1]=='htm')
or
if($document != '.' && $document != '..' && $ext[1]=='doc')
up
-3
rehfeld.us
19 years ago
regarding rlh at d8acom dot com method,

It is incorrect. Well, it works but you are not guaranteed the file extension using that method.

for example :   filename.inc.php

your method will tell you the ext is "inc", but it is in fact "php"

heres a way that will work properly.

<?php

$dh
= opendir($dir);

while (
false !== ($document = readdir($dh))) {
   
$pos = strrpos($document, '.');
    if (
false !== $pos && strlen($document) > $pos + 1) {
       
$ext = substr($document, $pos + 1);
    }
}

?>
up
-2
david at bruchmann-web dot de
10 years ago
Today I got the in the comments already described behaviour that between directory and file can't be distinguished by is_file() or is_dir().
A dirty and incomplete hack is below, incomplete because it never includes links and I never tested what happens when a directory is not allowed to be read.

$items = scandir($dir);
foreach ($items as $item){
    if ($item!='.' && $item!='..'){
        $deep = @scandir($dir.'/'.$item);
        echo ($deep ? '[DIR] ':'[FILE] '.$item.nl2br(PHP_EOL);
    }
}
up
-4
alex at magemore dot com
7 years ago
it doesn't work for file over 8Gb. returns false when there actually a file.
it's probably connected to 32bit integer problem and filesize
up
-17
Anonymous
10 years ago
Please be aware wildcards do not work as one might expect.

<?php
$file
= '*.*';

if (
is_file($file) ) {
  echo(
$file . ' is a regular file' );
} else {
  echo(
$file . ' is not a regular file' );
}
?>

The above snippet suggests that *.* is a regular file. It does not sound regular to me. I would expect is_file() to return FALSE.
To Top