is_file

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

is_file判断文件名是否为常规文件

描述

is_file(string $filename): bool

判断给定文件是否为常规文件。

参数

filename

文件路径。

返回值

如果文件名存在且为常规文件,则返回 true,否则返回 false

注意: 由于 PHP 的整数类型是有符号的,并且许多平台使用 32 位整数,因此对于大于 2GB 的文件,某些文件系统函数可能会返回意外的结果。

错误/异常

失败时,将发出 E_WARNING

示例

示例 #1 is_file() 示例

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

上面的示例将输出

bool(true)
bool(false)

注释

注意: 此函数的结果会被缓存。有关更多详细信息,请参阅 clearstatcache()

提示

从 PHP 5.0.0 开始,此函数也可以与某些URL 包装器一起使用。请参阅 支持的协议和包装器,以确定哪些包装器支持 stat() 系列的功能。

参见

添加注释

用户贡献的注释 24 个注释

匿名
12 年前
请注意,如果父目录没有为您设置 +x,则 is_file() 将返回 false;这很有道理,但其他函数(如 readdir())似乎没有此限制。最终结果是您可以遍历目录中的文件,但 is_file() 始终会失败。
匿名
19 年前
### 符号链接会解析 ###

如果您传递一个符号链接(Unix 符号链接)作为参数,is_file 将解析符号链接,并将提供有关所引用文件的信息。例如

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

将打印“y”。

is_dir 也会解析符号链接。
gizmo at gizmo dot sk
16 年前
这里有一个解决文件大小限制的变通方法。使用 bash 文件测试运算符,因此它可以更改为测试目录等。(请参阅 http://tldp.org/LDP/abs/html/fto.html,了解可能的测试运算符)

<?php
function is_file_lfs($path){
exec('[ -f "'.$path.'" ]', $tmp, $ret);
return
$ret == 0;
}
?>
ludvig dot ericson at gmail dot com
19 年前
我倾向于使用大量的 include,我发现 is_file 是基于执行的脚本,而不是运行的脚本。
如果您请求 /foo.php,而 foo.php 如下所示
<?php
include('foobar/bar.php');
?>
而 bar.php 如下所示
<?php
echo (is_file('foo/bar.txt'));
?>

那么 PHP(在 win32 上,php 5.x)将查找 /foo/bar.txt,而不是 /foobar/foo/bar.txt。
您将不得不为其重写 is_file 语句,或者更改工作目录。
注意到这一点,因为我花了一些时间来解决这个问题,

欢呼,Toxik。
andreas dot stagl at fits dot at
22 年前
如果您在 win32 机器上以服务形式运行 apache,并且您尝试确定网络中其他计算机上的文件是否存在 - 例如:is_file('//servername/share/dir1/dir2/file.txt') - 当您以 LocalSystem 身份运行服务时,您可能会返回 false。为了避免这种情况,您必须以“注册的”域用户身份启动 Apache 服务。
匿名
13 年前
is_file 无法识别文件名包含奇怪字符的文件,如捷克语 ů 或俄语字符。

我已经看到许多脚本在从 is_file($path) 获取 false 后,认为路径是目录。当试图确定路径链接到文件还是目录时,您应该始终在从 is_file($path) 获取 false 后使用 is_dir。对于上述情况,两者都会失败。
cristian dot ban at neobytesolutions com
17 年前
关于 rehfeld dot us 的注释

根据我的经验,找到文件扩展名的最佳(也是最简单)方法是

<?php

// 当您确定它实际上有扩展名时使用。
$extension = end(explode(".", $file_name));

?>

或者

<?php

// 此方法还会检查它是否实际上有扩展名
$parts = explode(".", $file_name);
if (
is_array($parts) && count($parts) > 1)
$extension = end($parts);

?>
www.ip4t.net - abdelrahman nourallah
8 年前
有时此函数无法正常工作,因为权限问题,

您可以使用此函数,如果路径在最后包含点,则返回 true。

public function isFile($file) {
$f = pathinfo($file, PATHINFO_EXTENSION);
return (strlen($f) > 0) ? true : false;
}

isfile('http://www.ip4t.net/image.jpg');

您应该用要检查的文件路径替换 '' 之间的字符串
rigrace at swbell dot net
15 年前
我花了一天左右的时间才弄明白 is_file() 实际上是查找字符串形式的有效存在的路径/文件。它没有对给定的参数执行类似模式的测试。它测试的是给定的参数是否指向一个特定的存在的“name.ext”或其他(非目录)文件类型对象。
Jonathan Shaltz
18年前
这可能是一个新手错误,但请注意,路径是相对于文件系统和脚本的位置。这意味着 MS IIS 虚拟目录无法通过相对路径访问 - 使用绝对路径。
这让我很困惑,因为虚拟目录至少在 IIS 上可以通过 URL 访问。
Kevin Gregull
15 年前
此函数删除定义的文件夹中的所有内容
适用于 PHP 4 和 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);
}
}
}
}
}
?>
bill fumerola
18年前
小心,is_file() 对大于整数存储大小的文件(大多数情况下为 2^32)会失败。

警告:is_file():大文件 stat 失败(errno=75 - 值对定义的数据类型过大)
quietust at ircN dot org
22 年前
在 win32 下的 PHP 4.1.0 中,如果文件不存在,这似乎会打印出警告消息(使用 error_reporting = E_ALL & ~E_NOTICE)。
don dot duvall at deduvall dot com
14年前
我注意到在 Windows 服务器(主要是用于开发)上使用 is_file 使用完整路径 c:\ 并不总是有效。

我不得不使用
C:/foldertowww/site/file.ext

所以我执行了 str_replace('\\', '/', $path)
有时我不得不使用 \ 而不是 / (这是在 XP 上使用 apache2)。

但可以肯定的是,您不能混合使用分隔符。
samuel at jch-optimize dot net
2年前
还要注意,如果您设置了 open_basedir 配置,并且文件(或目录)不在配置的位置之一,则 is_file()(以及 is_dir())将返回 false。

基本上,正如其他笔记所述,如果您没有权限访问文件或目录,这些函数将返回 false,但这也是人们可能会忽略的另一个用例。
tatarynowicz at gmail dot com
17 年前
一个不必在硬编码完整路径和使用相对路径之间进行选择的方法是,通过以下代码行:

<?php
// 在引导文件中
define('DIR_ROOT', dirname(__FILE__));
// 在其他文件中,使用常量作为路径前缀
require(DIR_ROOT . '/relative/to/bootstrap.php');
?>

或者,如果您必须使用相对路径

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

这样,您所有的路径都将是绝对路径,但您可以将应用程序移动到文件系统中的任何位置。

顺便说一下,每次调用 dirname 都将在目录树中向上移动一级。

<?php
echo __FILE__;
// /www/site.com/public/index.php
echo dirname(__FILE__);
// /www/site.com/public
echo dirname(dirname(__FILE__));
// /www/site.com
?>
sy well-known-sign damla.net
16 年前
在 32 位环境中,这些函数(包括 is_file()、stat()、filesize())将无法正常工作,因为 PHP 的默认整数是有符号的。因此,任何超过约 21 亿字节的值实际上都会得到负值。

这实际上是一个错误,但我认为没有简单的解决方法。尝试切换到 64 位。
rlh at d8acom dot com
21年前
我做很多文件解析工作,发现以下技术非常有用

while (false !== ($document = readdir($my_dir)))
{
$ext=explode('.',$document);
if($document != '.' && $document != '..' && $ext[1])
{
'对文件执行某些操作...'
}
}

它绕过了这样的事实:当处理网站页面时,html 文件在下载时被读取为目录。它还允许您通过添加确定文件类型的能力来扩展上述方法的实用性,例如:

if($document != '.' && $document != '..' && $ext[1]=='htm')
或者
if($document != '.' && $document != '..' && $ext[1]=='doc')
rehfeld.us
19 年前
关于 rlh at d8acom dot com 的方法,

这是错误的。好吧,它可以工作,但您不能保证使用该方法获得文件扩展名。

例如:filename.inc.php

您的方法会告诉您 ext 是 "inc",但实际上是 "php"

以下是一种有效的方法。

<?php

$dh
= opendir($dir);

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

?>
ca dot redwood at gmail dot com
15 年前
这是一种简单的查找特定文件的方法,而不是使用 is_file()。
此示例适用于 Mac 标准,但很容易更改为 PC。

<?php
function isfile($file){
return
preg_match('/^[^.^:^?^\-][^:^?]*\.(?i)' . getexts() . '$/',$file);
//第一个字符不能是 . : ? - 后续字符不能是 : ?
//然后是一个 . 字符,并且必须以您的扩展名之一结尾
//getexts() 可以替换为您的扩展名模式
}

function
getexts(){
//在此处列出可接受的文件扩展名
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');
?>
alex at magemore dot com
7年前
它对超过 8Gb 的文件不起作用。当实际上存在文件时,它会返回 false。
这可能与 32 位整数问题和文件大小有关。
sarken at free dot fr
11年前
我明白了,is_file 在 /dev(linux)中的特定文件上无法正常工作。


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

或者 FIND 无法检测到常规文件。
root@boofh:/data# find /dev/ -type f
root@boofh:/data#

// 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
david at bruchmann-web dot de
11年前
今天,我遇到了评论中已经描述的行为,即 is_file() 或 is_dir() 无法区分目录和文件。
下面是一个不完整且不完善的 hack,因为它不包含链接,而且我从未测试过目录无法读取时会发生什么。

$items = scandir($dir);
foreach ($items as $item){
if ($item!='.' && $item!='..'){
$deep = @scandir($dir.'/'.$item);
echo ($deep ? '[DIR] ':'[FILE] '.$item.nl2br(PHP_EOL);
}
}
Anonymous
10年前
请注意,通配符的实际行为可能与您的预期不符。

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

if (
is_file($file) ) {
echo(
$file . ' 是一个普通文件' );
} else {
echo(
$file . ' 不是一个普通文件' );
}
?>

上面的代码片段表明 "*.*" 是一个普通文件。在我看来,这并不合理。我预计 is_file() 函数会返回 FALSE。
To Top