PHP文件系统

这篇博客详细介绍了PHP中关于文件系统的操作,包括使用fopen、fread、fclose读取文件,file_put_contents写入文件,创建和删除临时文件,移动、拷贝和删除文件的函数,以及检测文件属性和设置权限的方法。此外,还讨论了目录处理和文件路径的相关函数,并给出了一个简单的PHP文件留言本实现。
摘要由CSDN通过智能技术生成

1. 前言

我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。在电脑里面进行的这些操作,在代码里面如果能操作就好了。因为,如果有了这些操作。我们能做很多事情了:

可不可以写入修改配置文件?
是不是可以做PHP安装的时候检测文件的权限
是不是可以做生成Html文件等等很多不同的操作
… 其他太多太多的地方用到了文件操作。

2. fopen、fread、fclose操作读取文件

readfile读取文件:

那如何读取一个文件呢?我们先学一个函数。
int readfile ( string $文件名)

功能:传入一个文件路径,输出一个文件。
下面的这一段代码中,只要传入文件名或者指定的文件路径就把文件读取出来了。

<?php

   //linux类的读了方式
   readfile("/home/paul/test.txt");
   //windows类的读取方式
   readfile("c:\\boot.ini");
   
?>

注意:上面的代码中windows的斜线是 \ 斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线。

file_get_contents打开文件

<?php

$filename = 'NoAlike.txt';

$file_string = file_get_contents($filename);
echo $file_string;

?>

fopen、fread、fclose操作读取文件

上面file_get_contents打开文件的方式简单、粗暴。下面的
resource fopen ( string $文件名, string 模式)
string fread ( resource $操作资源, int 读取长度)
bool fclose ( resource $操作资源 )

fopen的模式有下面几个,我们来讲一下fopen的模式:

模式说明
r只读方式打开,将文件指针指向文件头。
r+读写方式打开,将文件指针指向文件头。
w写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
w+读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
a写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建
a+读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建
x创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建
x+创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建
<?php

   //你可以创建一个NoAlike.txt,以只读模式打开
   $fp = fopen('NoAlike.txt', "r");
   
   //var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource
   var_dump($fp);
   
?>

3. php创建和修改文件内容

file_put_contents写入文件

我们先来学习第一种写入文件的方式:

int file_put_contents ( string $文件路径, string $写入数据])

功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度

<?php

$data = "在PHP中文网学好PHP,妹子票子不再话下!";

$num_bytes = file_put_contents('big_baby.txt', $data);

if($num_bytes){

    echo '写入成功,我们读取看看结果试试:'.PHP_EOL;

    echo file_get_contents('big_baby.txt');

}else{
    echo '写入失败或者没有权限,注意检查';
}

?>

输出结果为:

写入成功,我们读取看看结果试试:
在PHP中文网学好PHP,妹子票子不再话下!

fwrite配合fopen进行写入操作

<?php

$filename = 'test.txt';
$fp= fopen($filename, "w");
$len = fwrite($fp, '我是一只来自北方的狼,却在南方冻成了狗');
fclose($fp);
print $len .'字节被写入了.';

?>

总结:
1.不论有没有新建都会打开文件重新写入。
2.原有的文件内容会被覆盖掉。
3.文件不存在会创建。

那我们来对比一下以下几个模式的不同:

模式说明
r只能读不能使用fwrite写
r+可操作读、写
w只可以写功能
w+即可读又可以写
x每次写入会干掉原有文件的内容,文件不存在都会创建
a每次写入都会向文件的尾端追加内容

注:a+ 是增强的追加功能。可以读取时也可以使用。

4. php创建临时文件

我们之前创建的文件都是永久文件。
而创建临时文件在我们平时的项目开发中也非常有用。

创建临时文件的几个好处:
文完后即删除。
不需要去维护这个文件的删除状态。

<?php

   //创建了一个临时文件
   $handle = tmpfile();

   //向里面写入了数据
   $num_bytes = fwrite($handle, '写入临时文件');

   //关闭临时文件,文件即被删除
   fclose($handle);

   echo  '向临时文件中写入了' .$num_bytes . '个字节.';
   
?>

输出结果为:

向临时文件中写入了18个字节.

5. php移动、拷贝和删除文件

我们日常在处理文件的时候,可以删除文件、重命名文件也可以也可复制文件。

我们先来说重命名,重命名的函数是:

重命名文件

bool rename($ 旧名,$ 新名);
这个函数返回一个bool值,将旧的名字改为新的名字。

<?php

//旧文件名
$filename1 = 'test.txt';

//新文件名
$filename2 = $filename1 . '.old';

//复制文件
rename($filename1, $filename2);

?>

复制文件

复制文件,就相当于是克隆技术,将一个原来的东西再克隆成一个新的东西。两个长得一模一样。
bool copy(源文件,目标文件)
功能:将指定路径的源文件,复制一份到目标文件的位置。

我们来通过实验和代码来玩玩:

<?php

//旧文件名
$filename1 = 'copy.txt';

//新文件名
$filename2 = $filename1 . '_new';

//修改名字。
copy($filename1, $filename2);

?>

总结:
你会通过上面的例子,发现多出来了一个文件。

删除文件

删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不到这个文件。
你只会发现,这个文件消失了。

bool unlink(指定路径的文件)

<?php

$filename = 'test.txt';

if (unlink($filename)) {
    echo  "删除 $filename 文件成功!\n";
} else {
    echo  "删除 $filename 文件失败!\n";
}

?>

6. 检测文件属性函数

我们假设安装界面的网址是:install.php,安装的锁文件是install.lock。我们就可以检测install.lock文件是否存在。

<?php

if(file_exists('install.lock')){
   echo '已安装,请不要再次进行安装';
   exit;
}

?>

常用文件属性函数

bool file_exists ( $指定文件名或者文件路径)
功能:文件是否存在。
bool is_readable ( $指定文件名或者文件路径)
功能:文件是否可读
bool is_writeable ( $指定文件名或者文件路径)
功能:文件是否可写
bool is_executable ( $指定文件名或者文件路径)
功能:文件是否可执行
bool is_file ( $指定文件名或者文件路径)
功能:是否是文件
bool is_dir ( $指定文件名或者文件路径)
功能:是否是目录
void clearstatcache ( void )
功能:清楚文件的状态缓存

7. php目录处理函数

处理文件夹的基本思想如下:

  1. 读取某个路径的时候判断是否是文件夹。
  2. 是文件夹的话,打开指定文件夹,返回文件目录的资源变量。
  3. 使用readdir读取一次目录中的文件,目录指针向后偏移一次。
  4. 使用readdir读取到最后,没有可读的文件返回false。
  5. 关闭文件目录。
函数名功能
opendir打开文件夹,返回操作资源
readdir读取文件夹资源
is_dir判断是否是文件夹
closedir关闭文件夹操作资源
filetype显示是文件夹还是文件,文件显示file,文件夹显示dir
<?php

//设置打开的目录是D盘
$dir = "d:/";

//判断是否是文件夹,是文件夹
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        //读取到最后返回false,停止循环
        while (($file = readdir($dh)) !== false) {
            echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "\n";
        }
        closedir($dh);
    }
}

?>

8. php文件权限设置

chmod 主要是修改文件的的权限

<?php

//修改linux  系统/var/wwwroot/某文件权限为755
chmod("/var/wwwroot/index.html", 755);  
chmod("/var/wwwroot/index.html", "u+rwx,go+rx"); 
chmod("/somedir/somefile", 0755); 

?>

9. php文件路径函数

我们经常会遇到处理文件路径的情况。
例如:

  1. 文件后缀需要取出来
  2. 路径需要取出名字不取目录
  3. 只需要取出路径名中的目录路径
  4. 或者把网址中的各个部份进行解析取得独立值
  5. 甚至是自己组成一个url出来

很多地方都需要用路径处理类的函数。

我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:

函数名功能
pathinfo返回文件的各个组成部份
basename返回文件名
dirname文件目录部份
http_build_url生成一个url
<?php

$path_parts = pathinfo('d:/php/index.inc.php');

echo '文件目录名:'.$path_parts['dirname']."\n";
echo '文件全名:'.$path_parts['basename']."\n";
echo '文件扩展名:'.$path_parts['extension']."\n";
echo '不包含扩展的文件名:'.$path_parts['filename']."\n";

?>

输出结果为:

文件目录名:d:/php
文件全名:index.inc.php
文件扩展名:php
不包含扩展的文件名:index.inc

10. php实现文件留言本

我们来看一下文件结构:

index.php —展示输入框和留言内容
write.php —向message.txt写入数据
message.txt —存入聊天内容

index.php文件

<?php

//设置时区
date_default_timezone_set('PRC');
//读了内容
@$string = file_get_contents('message.txt');
//如果$string 不为空的时候执行,也就是message.txt中有留言数据
if (!empty($string)) {
    //每一段留言有一个分格符,但是最后多出了一个&^。因此,我们要将&^删掉
    $string = rtrim($string, '&^');
    //以&^切成数组
    $arr = explode('&^', $string);
    //将留言内容读取
    foreach ($arr as $value) {
        //将用户名和内容分开
        list($username, $content, $time) = explode('$#', $value);
        //echo '用户名为:' . $username . "\t内容为:" . $content . "\t时间为:" . date('Y-m-d H:i:s', $time);
        echo '用户名为:<font color="green">' . $username . '</font>内容为:<font color="red">' . $content . '</font>时间为' . date('Y-m-d H:i:s', $time);
        echo '<hr />';
        }
}

?>

<h1>基于文件的留言本演示</h1>

<form action="write.php" method="post" >
    用户名:<input type="text" name="username" /><br />
    留言内容:<textarea  name="content" >  </textarea><br />
    <input type="submit" value="提交" />
</form>

看了刚刚的展示内容,我们知道文件存储时:

1.段与段之间进行了分割
2.内容与用户之前用一个特殊的符号进行了分割

下面我们来写write.php写入留言至文件的代码:

<?php

//追加方式打开文件
$fp = fopen('message.txt', 'a');

//设置时间
$time = time();

//得到用户名
$username = trim($_POST['username']);
//得到内容
$content = trim($_POST['content']);


//组合写入的字符串:内容和用户之间分开,使用$#
//行与行之间分开,使用&^
$string = $username . '$#' . $content . '$#' . $time . '&^';

//写入文件
fwrite($fp, $string);


//关闭文件
fclose($fp);

header('location:index.php');

?>

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值