PHP手册整理 - 文件系统处理

文件校验函数【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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值