文件校验函数【is_file、is_dir、file_exists、is_readable、is_writeable、is_executable】:
// is_file — 判断给定文件名是否为一个正常的文件
var_dump(is_file('a_file.txt')) . "\n"; // true
var_dump(is_file('/usr/bin/')) . "\n"; // false
// is_dir — 判断给定文件名是否是一个目录
var_dump(is_dir('a_file.txt')); // false
var_dump(is_dir('./vue/js')); // true
// file_exists — 检查文件或目录是否存在
$filename = '/path/to/foo.txt';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
// is_readable — 判断给定文件名是否可读
$filename = 'test.txt';
if (is_readable($filename)) {
echo 'The file is readable';
} else {
echo 'The file is not readable';
}
// is_writeable — 判断给定的文件名是否可写
$filename = 'test.txt';
if (is_writeable($filename)) {
echo 'The file is write';
} else {
echo 'The file is not write';
}
// is_executable — 判断给定文件名是否可执行
$file = '/home/vincent/somefile.sh';
if (is_executable($file)) {
echo $file.' is executable';
} else {
echo $file.' is not executable';
}
文件属性函数【filemtime、fileatime、filesize、basename、stat、fstat、clearstatcache、pathinfo】:
// filemtime — 取得文件修改时间
$filename = 'somefile.txt';
if (file_exists($filename)) {
echo "$filename 最后修改: " . date("Y-m-d H:i:s", filemtime($filename));
}
// fileatime — 取得文件的上次访问时间
$filename = 'somefile.txt';
if (file_exists($filename)) {
echo "$filename 最后一次访问: " . date("Y-m-d H:i:s", fileatime($filename));
}
// filesize — 取得文件大小
$filename = 'somefile.txt';
echo $filename . ': ' . filesize($filename) . ' bytes';
// basename — 返回路径中的文件名部分
echo "1) ".basename("/test/somefile.txt", ".txt").PHP_EOL; // somefile
echo "2) ".basename("/test/somefile.txt").PHP_EOL; // somefile.txt
// stat — 返回文件的所有属性信息
$stat = stat('C:\php\php.exe'); // 返回当前文件属性
/* Array
(
[dev] => 3425007921 设备号
[ino] => 562949953423338 节点号
[mode] => 33279 节点保护模式
[nlink] => 1 链接数
[uid] => 0 所有者的用户 id
[gid] => 0 所有者的组 id
[rdev] => 0 设备类型
[size] => 130560 文件大小的字节数
[atime] => 1603822798 上次访问时间(Unix 时间戳)
[mtime] => 1603822799 上次修改时间(Unix 时间戳)
[ctime] => 1603822798 上次改变时间(Unix 时间戳)
[blksize] => -1 文件系统 IO 的块大小
[blocks] => -1 所占据块的数目
)
*/
// fstat — 通过已打开的文件指针取得文件信息(返回结果跟 stat 一致)
$fp = fopen("/etc/passwd", "r"); // 打开文件
$fstat = fstat($fp); // 取得统计信息
fclose($fp); // 关闭文件
print_r(array_slice($fstat, 13));// 只显示关联数组部分
// clearstatcache — 清除文件状态缓存
clearstatcache();
/*
当使用 stat(),lstat() 或者任何受影响函数时,PHP 将缓存这些函数的返回信息以提供更快的性能。
然而在某些情况下,你可能想清除被缓存的信息。
例如:如果在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险时,
你需要清除文件状态缓存。这种情况下,可以用 clearstatcache() 函数来清除被 PHP 缓存的该文件信息
受影响函数:
stat(), lstat(), file_exists(), is_writable(), is_readable(),
is_executable(), is_file(),is_dir(), is_link(), filectime(),
fileatime(), filemtime(),fileinode(), filegroup(), fileowner(),
filesize(), filetype() 和 fileperms()。
*/
// pathinfo — 返回文件路径的信息
print_r(pathinfo('D:\php-7.4.12\php.exe'));
/*
Array
(
[dirname] => D:\php-7.4.12 目录名称
[basename] => php.exe 完整文件名称
[extension] => exe 文件后缀名
[filename] => php 文件名称
)
*/
文件操作函数【unlink、copy、file_put_contents、file_get_contents、rename、fopen 】:
// unlink — 删除文件
unlink('test.html');
// copy — 拷贝文件
$file = 'example.txt';
$newfile = 'example.txt.bak';
if (!copy($file, $newfile)) {
echo "failed to copy $file...\n";
}
// file_put_contents — 将一个字符串写入文件
$start_time = microtime(true);
$name = 'test.log';
$size = 10*1024*1024;
while (1) {
clearstatcache();
if(filesize($name) >= $size){
break;
}
$str = var_export($_SERVER,true);
file_put_contents($name, $str.PHP_EOL, FILE_APPEND);
}
echo '耗时:'.(microtime(true) - $start_time);
// file_get_contents — 将整个文件读入一个字符串【大文件不建议使用,占内存】
$homepage = file_get_contents('http://www.example.com/');
$file = file_get_contents('./people.txt');
$start_time = microtime(true);
$flie_name = 'test.log';
$flie_size = 10*1024*1024;
// $fh = fopen($flie_name, 'rb'); // 以读取方式打开
$fh = fopen($flie_name, 'a+b'); // 以追加的方式读写
// $fh = fopen($flie_name, 'w+b'); // 以覆盖的方式读写
for ($i=0; $i < 1000; $i++) {
fwrite($fh, $i.PHP_EOL); // 写入文件
}
rewind($fh); // 倒回文件指针的位置
$contents = fread($fh, filesize($flie_name)); // 按文件大小读取文件内容
rewind($fh); // 倒回文件指针的位置
// 从文件指针中读取一行,如果不指定第二个参数,默认1k
while (($buffer = fgets($fh, 4096)) !== false) {
echo $buffer;
}
// 文件指针是否到了文件结束的位置
if (!feof($fh)) {
echo "读取文件失败";
}
// 从文件指针中读取字符
while (false !== ($char = fgetc($fh))) {
echo "$char\n";
}
// 返回文件指针读/写的位置
$curr_position = ftell($fh);
// 取文件锁定
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
ftruncate($fp, 0); // 将文件截断到给定的长度
fwrite($fp, date('Y-m-d H:i:s').PHP_EOL);
fflush($fp); // 释放锁之前将缓冲内容输出到文件
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "拿不到锁!";
}
fclose($fh); // 关闭文件句柄
echo '耗时:'.(microtime(true) - $start_time);
// 重命名一个文件
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
// 将一个文件读入数组。
$lines = file('http://www.example.com/');
// 在数组中循环,显示 HTML 的源文件并加上行号。
foreach ($lines as $line_num => $line) {
echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
// 输出文件
$file = 'monkey.gif';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
目录属性函数【disk_free_space、disk_total_space】
// disk_free_space — 返回目录中的可用空间
$free = disk_free_space('./');
var_dump($free/1024/1024/1024); // 转成GB
// disk_total_space — 返回一个目录的磁盘总大小
$total = disk_total_space('./');
var_dump($total/1024/1024/1024); // 转成GB
目录操作函数【dirname、opendir、readdir、closedir、rewinddir 、glob、mkdir、rmdir 】:
// dirname — 返回路径中的目录部分
dirname('c:/Temp/x'); // 返回 'c:/Temp'
// opendir — 打开目录句柄
$dir = "/etc/php5/";
if (is_dir($dir)) {
if ($dh = opendir($dir)) { // 打开一个目录,然后继续读取它的内容
while (($file = readdir($dh)) !== false) {
echo "filename: $file : filetype: " . filetype($dir . $file) . "\n";
}
closedir($dh);
}
}
// rewinddir — 倒回目录句柄
$dir = "/images/";
if (is_dir($dir)){ // 打开一个目录,并读取其内容,重复输出目录列表内容
if ($dh = opendir($dir)){
// 在图像目录中列出文件
while (($file = readdir($dh)) !== false){
echo "filename:" . $file . "<br>";
}
rewinddir();
// 再次列出图像目录中的文件
while (($file = readdir($dh)) !== false){
echo "filename:" . $file . "<br>";
}
closedir($dh);
}
}
// glob — 寻找与模式匹配的文件路径
$dir_list = glob('myadmin/*.php');
print_r($dir_list);
// mkdir — 新建目录
mkdir("/path/to/my/dir", 0775, true);
// rmdir — 删除目录
if (!is_dir('examples')) {
mkdir('examples');
}
rmdir('examples');
上传文件处理函数【is_uploaded_file、move_uploaded_file】:
// is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
echo "File ". $_FILES['userfile']['name'] ." uploaded successfully.\n";
echo "Displaying contents\n";
readfile($_FILES['userfile']['tmp_name']);
} else {
echo "有可能上传文件攻击: ";
echo "文件名:'{$_FILES['userfile']['tmp_name']}'";
}
// move_uploaded_file — 将上传的文件移动到新位置
$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}
// <input type="hidden" name="MAX_FILE_SIZE" value="10000000">
// <input type="file" name="myfile[]">
// <input type="file" name="myfile[]">
// <input type="file" name="myfile[]">
文件系统相关扩展:
// getcwd — 取得当前工作目录
echo getcwd() . PHP_EOL; // /home/test
chdir('cvs'); // 改变当前目录的位置
echo getcwd() . PHP_EOL; // /home/test/cvs
// scandir — 列出指定路径中的文件和目录
$dir = '/tmp';
$files1 = scandir($dir);
$files2 = scandir($dir, 1);
/*
Array
(
[0] => .
[1] => ..
[2] => bar.php
[3] => foo.txt
[4] => somedir
)
Array
(
[0] => somedir
[1] => foo.txt
[2] => bar.php
[3] => ..
[4] => .
)
*/
// fgetss — 从文件指针中读取一行并过滤掉 HTML 标记
$str = <<<EOD
<html><body>
<p>Welcome! Today is the <?php echo(date('jS')); ?> of <?= date('F'); ?>.</p>
</body></html>
Text outside of the HTML block.
EOD;
file_put_contents('sample.php', $str);
$handle = @fopen("sample.php", "r");
if ($handle) {
while (!feof($handle)) {
$buffer = fgetss($handle, 4096);
echo $buffer;
}
fclose($handle);
}
// fscanf — 从文件中格式化输入
$handle = fopen("users.txt", "r");
while ($userinfo = fscanf($handle, "%s\t%s\t%s\n")) {
list ($name, $profession, $countrycode) = $userinfo;
}
fclose($handle);
// parse_ini_file — 解析一个配置文件
$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);
$ini_array = parse_ini_file("sample.ini", true); // 按块的方式输出
print_r($ini_array);