PHP文件与目录

PHP文件与目录

disk_total_space 返回目标磁盘总空间

disk_free_space返回目标磁盘剩余空间

$diskSpaceRes = disk_total_space(__DIR__ ) / pow(1024, 3);
$diskFreeRes =  number_format( disk_free_space(__DIR__)/pow(1024,3), 3);
echo sprintf( "%.3f"."</br>", $diskSpaceRes);
echo $diskFreeRes;

filesize 返回目标文件大小(单位:字节)

$file = number_format(filesize('./test.mp4') / pow(1024, 1), 2) ."KB";
echo $file; // 712.05KB

常用简单函数

函数名用途
is_writable判断给定的文件名是否可写
is_readable判断给定文件名是否可读
file_exists检查文件或目录是否存在
is_file判断给定文件名是否为一个正常的文件
is_dir判断给定文件名是否是一个目录。
filemtime回文件中的数据块上次被写入的时间(时间戳)
basename返回路径中的文件名部分
dirname返回路径中的目录部分
mkdir支持递归的目录创建,参数分别是:目录、权限位、递归创建
rmdir删除指定的目录,该目录必须是空的,而且要有相应的权限。
rename重命名一个文件或目录,也可以进行文件移动。
copy复制文件

fopen 用于打开文件或 URL 的函数。它用于创建一个文件指针,使您能够对文件进行读取、写入和其他操作。

mode说明
‘r’只读方式打开,将文件指针指向文件头。
‘r+’读写方式打开,将文件指针指向文件头。
‘w’写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘w+’读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘a’写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘a+’读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘x’创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。
‘x+’创建并以读写方式打开,其他的行为和 ‘x’ 一样。
// 打开一个只读模式的文件
$handle = fopen('file.txt', 'r');

// 打开一个只写模式的文件,并将内容写入其中
$handle = fopen('file.txt', 'w');
fwrite($handle, 'Hello, World!');
fclose($handle);

// 打开一个追加模式的文件,并将内容追加到末尾
$handle = fopen('file.txt', 'a');
fwrite($handle, 'More content.');
fclose($handle);

注意:fopen() 打开文件后切记关闭文件指针! fclose();

fread 所读取的字符串, 或者在失败时返回 FALSE

function fread($stream, int $length): string|false {}  

fseek 可以在打开的文件中移动文件指针的位置,以便在不同位置进行读取和写入操作。

0 表示成功,返回 -1 表示失败

  • $handle:打开的文件指针资源。

  • $offset:要移动的字节数。

  •   $whence
    

    (可选):指定偏移量的基准位置。可使用以下常量之一:

    • SEEK_SET:从文件开头开始计算偏移量。
    • SEEK_CUR:从当前位置开始计算偏移量。
    • SEEK_END:从文件末尾开始计算偏移量。
$file = fopen('file.txt', 'r');
// 将文件指针移动到文件的第 10 个字节处
fseek($file, 10, SEEK_SET);
// 从当前位置向后移动 5 个字节
fseek($file, 5, SEEK_CUR);
// 从文件末尾向前移动 20 个字节
fseek($file, -20, SEEK_END);
fclose($file);


//例子:
$data = "./test.txt";
$f = fopen($data,'r');
fseek($f,200, 0);
$content = "";
while (!feof($f)){
    $content .= fread($f , 1024);
}
fclose($f);
echo $content;


**fwrite 写入文件,返回写入的字符数,出现错误时则返回 ** FALSE

fclose 关闭一个已打开的文件指针

feof 测试文件指针是否到了文件结束的位置

$handle = fopen('./text.txt','w+');
fwrite($handle,'Hello php');
fseek($handle, 0);
echo fread($handle, 999);
fclose($handle);

fgetc 读取一个字符

fgets 读取一行内容

fgetss 从文件指针中读取一行并过滤掉 HTML 标记。参数分别表示:资源对象、读取数量、允许标签。

fgetcsv 从文件指针中读入一行并解析 CSV 字段。

readfile 读取文件全部内容 (大文件慎用)

$data = './test.txt';
$handle = fopen($data,'r+');
while ($s = fgetc($handle)){
    echo $s;
}
while ($s = fgets($handle)){
    echo $s;
}
fclose($handle);


$handle = fopen('index.html','rb');
while(!feof($handle)){
    echo fgetss($handle,20,'<h1><title>');
}
fclose($handle);


$data = './customer.csv';
$handle = fopen($data,'r');
while (($res = fgetcsv($handle) )!== false){
    print_r($res);
}
fclose($handle);


header('Content-type:image/jpeg');
readfile('user.jpeg');

flock 锁定文件操作,如果使用flock 锁定文件,必须保证在所有使用文件地方执行 flock 才有意义。如果过早的系统因为不支持锁定操作,函数执行将没有效果如 FAT 系统。

锁定方式说明
LOCK_SH取得共享锁定(读取的程序)
LOCK_EX取得独占锁定(写入的程序)
LOCK_UN释放锁定(无论共享或独占)
LOCK_NB无法建立锁定时,此操作可不被阻断,马上返回进程。通常与 LOCK_SH 或 LOCK_EX 做 OR(|)组合使用。(Windows 系统上还不支持)
//写锁 LOCK_SH
// 1.php
$handle = fopen('demo.txt','rb');
$stat = flock($handle,LOCK_SH);
sleep(5);
echo fgetss($handle);
flock($handle,LOCK_UN);

//2.php
$handle = fopen('demo.txt','rb');
$stat = flock($handle,LOCK_SH);
echo fgetss($handle);
flock($handle,LOCK_UN);


//读锁 LOCK_EX
//1.php
$handle = fopen('demo.txt','rb');
$stat = flock($handle,LOCK_EX);
sleep(5);
echo fgetss($handle);
flock($handle,LOCK_UN);

//2.php
$handle = fopen('demo.txt','rb');
$stat = flock($handle,LOCK_SH);
echo fgetss($handle);
flock($handle,LOCK_UN);

防止阻塞

//1.php
$handle = fopen('demo.txt','ab');
$stat = flock($handle,LOCK_EX);
sleep(5);
echo fgetss($handle);
flock($handle,LOCK_UN);


//2.php
$handle = fopen('demo.txt','ab');
$stat = flock($handle,LOCK_SH | LOCK_NB,$wouldblock);
if($stat){
    $d = fwrite($handle,'Hello Php!');
    echo fgetss($handle);
}else{
    echo 'file is locked';
}
flock($handle,LOCK_UN);

file_put_contents 将一个字符串写入文件。

file_get_content 将整个文件读入一个字符串,如果打开远程文件需要开启 php.ini 中的 allow_url_fopen 选项。

file_put_contents('demo.txt','hello php',FILE_APPEND); //FILE_APPEND 文件后面追加
file_get_contents('demo.txt');
file_get_contents('https://bing.com');

var_export

输出或返回一个变量的字符串表示。

下面是将数组保存到文件中的代码,并支持 include 获取数组数据。

$user = [
    ['name'=>'刘备'],
    ['name'=>'关羽'],
     ['name'=>'张飞']
];
$content =var_export($user,true);
file_put_contents('users.php','<?php return '.$content.';');

opendir 函数类似于 fopen 操作方式,可能获取目录指针读取目录

scandir 列出指定路径中的文件和目录

$handle = opendir('../php');
while (false!==($file = readdir($handle))) {
    if (!in_array($file, ['.','..'])) {
        echo filetype($file)."\t".$file.'<br/>';
    }
}
closedir($handle);


foreach (scandir('../php') as $file) {
    if (!in_array($file, ['.','..'])) {
        echo filetype($file)."\t\t".$file.'<hr/>';
    }
}

glob 寻找与模式匹配的文件路径。

选项说明
GLOB_MARK在每个返回的项目中加一个斜线
GLOB_NOSORT按照文件在目录中出现的原始顺序返回(不排序)
GLOB_NOCHECK如果没有文件匹配则返回用于搜索的模式
GLOB_ERR停止并读取错误信息(比如说不可读的目录),默认的情况下忽略所有错误
GLOB_BRACE设置多个匹配模式,如:{.php,.txt}

遍历目录

$files = glob('../../*');
print_r($files);

指定检索文件类型

$files = glob('*.php', GLOB_ERR);

设置多个匹配模式

$files = glob("{*.php,*.txt}", GLOB_BRACE);
print_r($files);

目录大小

function dirSize($dir):int
{
    $size= 0;
    foreach (glob($dir.'/*') as $file) {
        $size += is_file($file)?filesize($file):dirSize($file);
    }
    return $size;
}
echo round(dirSize('/home/vagrant')/1024/1024).'MB';

删除目录

function delDir($dir):bool
{
    if (!is_dir($dir)) {
        return true;
    }
    foreach (glob($dir.'/*') as $file) {
        is_file($file)?unlink($file):delDir($file);
    }
    return rmdir($dir);
}
delDir('../php2');

复制目录

function copyDir($dir, $to):bool
{
    is_dir($to) or mkdir($to, 0755, true);
    foreach (glob($dir.'/*') as $file) {
        $target = $to.'/'.basename($file);
        is_file($file)?copy($file, $target):copyDir($file, $target);
    }
    return true;
}
copyDir('../php', '../php2');

移动目录

移动目录分两步执行,第一步是复制目录,第二步是删除目录,所以使用上面两个函数的综合即可以。

function moveDir($dir, $to):bool
{
    copyDir($dir, $to);
    return delDir($dir);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码炼金术

何以解忧,唯有打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值