请注意,如果父目录没有为您设置 +x,则 is_file() 将返回 false;这很有道理,但其他函数(如 readdir())似乎没有此限制。最终结果是您可以遍历目录中的文件,但 is_file() 始终会失败。
(PHP 4, PHP 5, PHP 7, PHP 8)
is_file — 判断文件名是否为常规文件
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()。
请注意,如果父目录没有为您设置 +x,则 is_file() 将返回 false;这很有道理,但其他函数(如 readdir())似乎没有此限制。最终结果是您可以遍历目录中的文件,但 is_file() 始终会失败。
### 符号链接会解析 ###
如果您传递一个符号链接(Unix 符号链接)作为参数,is_file 将解析符号链接,并将提供有关所引用文件的信息。例如
touch file
ln -s file link
echo '<? if (is_file("link")) echo "y\n"; ?>' | php -q
将打印“y”。
is_dir 也会解析符号链接。
这里有一个解决文件大小限制的变通方法。使用 bash 文件测试运算符,因此它可以更改为测试目录等。(请参阅 http://tldp.org/LDP/abs/html/fto.html,了解可能的测试运算符)
<?php
function is_file_lfs($path){
exec('[ -f "'.$path.'" ]', $tmp, $ret);
return $ret == 0;
}
?>
我倾向于使用大量的 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。
如果您在 win32 机器上以服务形式运行 apache,并且您尝试确定网络中其他计算机上的文件是否存在 - 例如:is_file('//servername/share/dir1/dir2/file.txt') - 当您以 LocalSystem 身份运行服务时,您可能会返回 false。为了避免这种情况,您必须以“注册的”域用户身份启动 Apache 服务。
is_file 无法识别文件名包含奇怪字符的文件,如捷克语 ů 或俄语字符。
我已经看到许多脚本在从 is_file($path) 获取 false 后,认为路径是目录。当试图确定路径链接到文件还是目录时,您应该始终在从 is_file($path) 获取 false 后使用 is_dir。对于上述情况,两者都会失败。
关于 rehfeld dot us 的注释
根据我的经验,找到文件扩展名的最佳(也是最简单)方法是
<?php
// 当您确定它实际上有扩展名时使用。
$extension = end(explode(".", $file_name));
?>
或者
<?php
// 此方法还会检查它是否实际上有扩展名
$parts = explode(".", $file_name);
if (is_array($parts) && count($parts) > 1)
$extension = end($parts);
?>
有时此函数无法正常工作,因为权限问题,
您可以使用此函数,如果路径在最后包含点,则返回 true。
public function isFile($file) {
$f = pathinfo($file, PATHINFO_EXTENSION);
return (strlen($f) > 0) ? true : false;
}
isfile('http://www.ip4t.net/image.jpg');
您应该用要检查的文件路径替换 '' 之间的字符串
我花了一天左右的时间才弄明白 is_file() 实际上是查找字符串形式的有效存在的路径/文件。它没有对给定的参数执行类似模式的测试。它测试的是给定的参数是否指向一个特定的存在的“name.ext”或其他(非目录)文件类型对象。
这可能是一个新手错误,但请注意,路径是相对于文件系统和脚本的位置。这意味着 MS IIS 虚拟目录无法通过相对路径访问 - 使用绝对路径。
这让我很困惑,因为虚拟目录至少在 IIS 上可以通过 URL 访问。
此函数删除定义的文件夹中的所有内容
适用于 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);
}
}
}
}
}
?>
小心,is_file() 对大于整数存储大小的文件(大多数情况下为 2^32)会失败。
警告:is_file():大文件 stat 失败(errno=75 - 值对定义的数据类型过大)
在 win32 下的 PHP 4.1.0 中,如果文件不存在,这似乎会打印出警告消息(使用 error_reporting = E_ALL & ~E_NOTICE)。
我注意到在 Windows 服务器(主要是用于开发)上使用 is_file 使用完整路径 c:\ 并不总是有效。
我不得不使用
C:/foldertowww/site/file.ext
所以我执行了 str_replace('\\', '/', $path)
有时我不得不使用 \ 而不是 / (这是在 XP 上使用 apache2)。
但可以肯定的是,您不能混合使用分隔符。
还要注意,如果您设置了 open_basedir 配置,并且文件(或目录)不在配置的位置之一,则 is_file()(以及 is_dir())将返回 false。
基本上,正如其他笔记所述,如果您没有权限访问文件或目录,这些函数将返回 false,但这也是人们可能会忽略的另一个用例。
一个不必在硬编码完整路径和使用相对路径之间进行选择的方法是,通过以下代码行:
<?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
?>
在 32 位环境中,这些函数(包括 is_file()、stat()、filesize())将无法正常工作,因为 PHP 的默认整数是有符号的。因此,任何超过约 21 亿字节的值实际上都会得到负值。
这实际上是一个错误,但我认为没有简单的解决方法。尝试切换到 64 位。
我做很多文件解析工作,发现以下技术非常有用
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')
关于 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);
}
}
?>
这是一种简单的查找特定文件的方法,而不是使用 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');
?>
我明白了,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
今天,我遇到了评论中已经描述的行为,即 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);
}
}