# PHP文件信息获取:file_exists()、is_file()、filesize()
在PHP开发中,经常需要检查文件是否存在、判断是否为常规文件以及获取文件大小等信息。本文将详细介绍PHP中三个常用的文件信息获取函数:`file_exists()`、`is_file()`和`filesize()`。
## 1. file_exists() - 检查文件或目录是否存在
### 基本用法
```php
bool file_exists ( string $filename )
```
`file_exists()`函数用于检查指定的文件或目录是否存在。如果存在则返回`true`,否则返回`false`。
### 示例代码
```php
$filename = 'example.txt';
if (file_exists($filename)) {
echo "文件 $filename 存在";
} else {
echo "文件 $filename 不存在";
}
```
### 注意事项
- 该函数可以检查文件和目录
- 对于符号链接,会检查链接指向的目标是否存在
- 在NFS等网络文件系统上可能有性能问题
- 受PHP的`safe_mode`和`open_basedir`限制影响
## 2. is_file() - 判断是否为常规文件
### 基本用法
```php
bool is_file ( string $filename )
```
`is_file()`函数用于判断指定路径是否是一个常规文件(不是目录或特殊文件)。
### 示例代码
```php
$filename = 'example.txt';
if (is_file($filename)) {
echo "$filename 是一个常规文件";
} else {
echo "$filename 不是常规文件或不存在";
}
```
### 与file_exists()的区别
- `file_exists()`对于目录也返回`true`
- `is_file()`仅对常规文件返回`true`,目录返回`false`
- `is_file()`对不存在的路径返回`false`
## 3. filesize() - 获取文件大小
### 基本用法
```php
int filesize ( string $filename )
```
`filesize()`函数返回指定文件的大小(字节数),如果失败返回`false`。
### 示例代码
```php
$filename = 'example.txt';
if (file_exists($filename)) {
$size = filesize($filename);
echo "文件 $filename 的大小是 $size 字节";
} else {
echo "文件 $filename 不存在";
}
```
### 处理大文件
对于大于2GB的文件,在32位系统上可能返回错误结果。可以使用以下方法处理:
```php
function getFileSize($filename) {
if (file_exists($filename)) {
$size = filesize($filename);
if ($size < 0) {
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
exec('for %I in ("'.$filename.'") do @echo %~zI', $output);
$size = $output[0];
}
}
return $size;
}
return false;
}
```
## 综合应用示例
```php
$filename = 'data.csv';
// 检查文件是否存在
if (!file_exists($filename)) {
die("错误:文件 $filename 不存在");
}
// 检查是否是常规文件
if (!is_file($filename)) {
die("错误:$filename 不是常规文件");
}
// 获取文件大小
$size = filesize($filename);
// 格式化文件大小
function formatSize($bytes) {
if ($bytes >= 1073741824) {
return number_format($bytes / 1073741824, 2) . ' GB';
} elseif ($bytes >= 1048576) {
return number_format($bytes / 1048576, 2) . ' MB';
} elseif ($bytes >= 1024) {
return number_format($bytes / 1024, 2) . ' KB';
} else {
return $bytes . ' 字节';
}
}
echo "文件信息:\n";
echo "文件名: $filename\n";
echo "大小: " . formatSize($size) . "\n";
echo "最后修改时间: " . date("Y-m-d H:i:s", filemtime($filename)) . "\n";
```
## 性能考虑
1. 多次文件系统调用会影响性能,尽量缓存结果
2. 在循环中使用这些函数时尤其要注意
3. 对于网络文件系统(如NFS),考虑使用`clearstatcache()`清除状态缓存
## 错误处理
```php
$filename = 'nonexistent.txt';
// 检查文件是否存在
if (@file_exists($filename)) {
// 检查是否是文件
if (@is_file($filename)) {
// 获取文件大小
$size = @filesize($filename);
if ($size !== false) {
echo "文件大小: $size 字节";
} else {
echo "无法获取文件大小";
}
} else {
echo "$filename 不是常规文件";
}
} else {
echo "$filename 不存在";
}
```
## 总结
- `file_exists()`:检查文件或目录是否存在
- `is_file()`:检查路径是否为常规文件
- `filesize()`:获取文件大小(字节数)
在实际开发中,合理使用这些函数可以帮助我们更好地处理文件操作,编写更健壮的代码。记得总是检查函数返回值并处理可能的错误情况。