【php学习笔记】文件系统---制作备忘录和修改配置文件(上)

简介: 【php学习笔记】文件系统---制作备忘录和修改配置文件

文件系统


我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。


在电脑里面进行的这些操作,在代码里面如果能操作就好了。


因为,如果有了这些操作。我们能做很多事情了:


可不可以写入修改配置文件?

是不是可以做PHP安装的时候检测文件的权限

是不是可以做生成Html文件等等很多不同的操作

… 其他太多太多的地方用到了文件操作。


学习文件处理本质上面就是学习文件处理的函数。再结合之前写的代码,完善自己的业务处理能力。


读取文件


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


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


file_get_contents($filename);
<?php
   $filename = 'NoAlike.txt';
   $filestring = file_get_contents($filename);
   echo $filestring;
?>


fopen、fread、fclose操作读取文件


上面file_get_contents打开文件的方式简单、粗暴。下面的


resource fopen ( string $文件名, string 模式)
string fread ( resource $操作资源, int 读取长度)
bool fclose ( resource $操作资源 )

通过上面的函数我们来讲解资源类型的通常操作方式:


1.打开资源


2.使用相关函数进行操作


3.关闭资源


fopen函数 fopen函数的功能是打开文件,参数主要有两个:


1.文件打开的路径


2.打开文件的模式


返回类型是一个资源类型,我们第一次遇到了之前基础类型的时候讲到的资源类型。

资源类型需要其他的函数来操作这个资源。所有的资源有打开就要有关闭。


fread函数 函数的功能的功能是读取打开的文件资源。读取指定长度的文件资源,读取一部份向后移动一部份。至到文件结尾。


fclose函数 fclose函数的功能是关闭资源。资源有打开就有关闭。


了解完函数,后两个函数比较简单。而fopen函数的模式到底是什么,fopen的模式有下面几个,我们来讲一下fopen的模式:

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

接下来,我们只来学习r模式,下结课我们在将写入的时候再来讲讲其他几个模式。


我们先会读取文件了,才能很好的掌握写入文件。


1.打开文件


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


2.读取文件


<?php
   $fp = fopen('NoAlike.txt', "r");
   //打开一个文件类型后,读取长度
   $contents = fread($fp, 1024);
?>


3.关闭文件

<?php
   $fp = fopen($filename, 'r');
   $contents = fread($fp, 1024);
   fclose($fp);
   echo $contents;
?>


其他注意事项:

模式

说明

t

windows下将\n转为\r\n

b

二进制打开模式

说明:


实验无法让肉眼看到这个实验效果。大家记住有这个特点即可。


Windows 下提供了一个文本转换标记(‘t’)可以透明地将 \n 转换为 \r\n。

与此对应还可以使用 ‘b’ 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 ‘b’ 或者用 ‘t’ 作为 mode 参数的最后一个字符。


创建和修改文件内容


上一节当中我们学习了读取文件特别好掌握。这一节当中我们来讲解的是写入文件。


file_put_contents写入文件


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

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


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


<?php
   $data = "在PHP中文网学好PHP,妹子票子不再话下!";
   $numbytes = file_put_contents('binggege.txt', $data);
   if($numbytes){
       echo '写入成功,我们读取看看结果试试:';
       echo file_get_contents('binggege.txt');
   }else{
       echo '写入失败或者没有权限,注意检查';
   }
?>

我们发现写入文件也挺简单的。按照这个函数的格式,指定文件,写入字符串数据就可以了。


fwrite配合fopen进行写入操作


int fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])


注:fwrite的别名函数是fputs


我们上节课试了r模式,只道是读取的时候使用,接下来我们用fwrite加上fopen中的w,写入模式来进行文件写入。


我们来看一下特点:


写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。


注意:在下面的实验中,你可以试试新建个test.txt文件向里面写入内容。然后,可以试试把test.txt删除。看看有什么提示。

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


总结:


1.不论有没有新建都会打开文件重新写入

2.原有的文件内容会被覆盖掉

3.文件不存在会创建


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

模式

说明

r

只能读不能使用fwrite写

r+

可操作读、写

w

只可以写功能

w+

即可读又可以写


我们来通过实验证明一下:

<?php
   $filename = 'test.txt';
   $fp= fopen($filename, "r+");
   $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
   fclose($fp);
   print $len .'字节被写入了\n';
?>

实验时可以把r后面的+号去掉。


我们通过实验,确实发现使用r模式,在文件存的时候可以进行写入数据,只用r的话,写入是不成功的。


a模式和w模式的不同


同样是下面的这段代码,我们改为a模式。

<?php
   $filename = 'test.txt';
   $fp= fopen($filename, "a");
   $len = fwrite($fp,'读大学迷茫了,PHP中文网学PHP给你希望');
   echo  $len .'字节被写入了\n';
?>

打开网页执行这段代码,你会发现:每刷新一次,文件中就会多一段

:读大学迷茫了,PHP中文网学PHP给你希望。


总结:

模式

总结

x

每次写入会干掉原有文件的内容,文件不存在都会创建

a

每次写入都会向文件的尾端追加内容


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


x模式和w模式的不同


这段代码我们再实验一次,改为x模式:


<?php
   $filename = 'test.txt';
   $fp= fopen($filename, "x");
   $len = fwrite($fp,'读大学迷茫了,PHP中文网学PHP给你希望');
   echo  $len .'字节被写入了\n';
?>

我们会发现:


   1.文件存在的时候会报错


   2.如果把$filename 改成其他的文件名,就可以了。但是,再次刷新的时候又报错了


   3.x+ 是增强的x模式。读取时也可以使用。

?>


我们发现写入文件也挺简单的。按照这个函数的格式,指定文件,写入字符串数据就可以了。


fwrite配合fopen进行写入操作


int fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])


注:fwrite的别名函数是fputs


我们上节课试了r模式,只道是读取的时候使用,接下来我们用fwrite加上fopen中的w,写入模式来进行文件写入。


我们来看一下特点:


写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。


注意:在下面的实验中,你可以试试新建个test.txt文件向里面写入内容。然后,可以试试把test.txt删除。看看有什么提示。

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


总结:


1.不论有没有新建都会打开文件重新写入

2.原有的文件内容会被覆盖掉

3.文件不存在会创建


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


模式  说明
只能读不能使用fwrite写
r+  可操作读、写
只可以写功能
w+  即可读又可以写

我们来通过实验证明一下:

<?php
   $filename = 'test.txt';
   $fp= fopen($filename, "r+");
   $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
   fclose($fp);
   print $len .'字节被写入了\n';
?>


实验时可以把r后面的+号去掉。


我们通过实验,确实发现使用r模式,在文件存的时候可以进行写入数据,只用r的话,写入是不成功的。


a模式和w模式的不同


同样是下面的这段代码,我们改为a模式。

<?php
   $filename = 'test.txt';
   $fp= fopen($filename, "a");
   $len = fwrite($fp,'读大学迷茫了,PHP中文网学PHP给你希望');
   echo  $len .'字节被写入了\n';
?>


打开网页执行这段代码,你会发现:每刷新一次,文件中就会多一段

:读大学迷茫了,PHP中文网学PHP给你希望。


总结:


模式 总结


**x 每次写入会干掉原有文件的内容,**文件不存在都会创建

a 每次写入都会向文件的尾端追加内容

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


x模式和w模式的不同


这段代码我们再实验一次,改为x模式:

<?php
   $filename = 'test.txt';
   $fp= fopen($filename, "x");
   $len = fwrite($fp,'读大学迷茫了,PHP中文网学PHP给你希望');
   echo  $len .'字节被写入了\n';
?>


我们会发现:


1.文件存在的时候会报错


2.如果把$filename 改成其他的文件名,就可以了。但是,再次刷新的时候又报错了


3.x+ 是增强的x模式。读取时也可以使用。


创建临时文件


我们之前创建的文件都是永久文件。


而创建临时文件在我们平时的项目开发中也非常有用。创建临时文件的几个好处:


文完后即删除


不需要去维护这个文件的删除状态


例如:我需要把A的文件内容转存B里面,把B的文件内容转存到C里面。


就跟现实生活中一样,我可以先用一个临时的瓶子把B的水装起来,然后把A的数据写入到B里面。把临时瓶子的水追加到C里面。


我们来学习一下这个函数:

resource tmpfile ( )


功能:创建一个临时文件,返回资源类型。关闭文件即被删除。


<?php
   //创建了一个临时文件
   $handle = tmpfile();
   //向里面写入了数据
   $numbytes = fwrite($handle, '写入临时文件');
   //关闭临时文件,文件即被删除
   fclose($handle);
   echo  '向临时文件中写入了'.$numbytes . '个字节';
?>


移动、拷贝和删除文件


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


那这这一节,我们就来讲解我们日常生活当中最常用到的一些操作。


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


重命名文件

bool rename($旧名,$新名);


这个函数返回一个bool值,将旧的名字改为新的名字。

<?php
   //旧文件名
   $filename = 'test.txt';
   //新文件名
   $filename2 = $filename . '.old';
   //复制文件
   rename($filename, $filename2);
?>


我们打开目录,我们可以看看效果,你会发现把指定的文件,复制了一份到了目标路径。


复制文件


复制文件,就相当于是克隆技术,将一个原来的东西再克隆成一个新的东西。两个长得一模一样。

bool copy(源文件,目标文件)


功能**:将指定路径的源文件,复制一份到目标文件的位置。**


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

<?php
   //旧文件名
   $filename = 'copy.txt';
   //新文件名
   $filename2 = $filename . '_new';
   //修改名字。
   copy($filename, $filename2);
?>


总结:

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


删除文件


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


你只会发现,这个文件消失了。


bool unlink(指定路径的文件)
<?php
   $filename = 'test.txt';
   if (unlink($filename)) {
       echo  "删除文件成功 $filename!\n";
   } else {
       echo "删除 $filename 失败!\n";
   }
?>


检测文件属性函数


有些同学特别好奇,**检测文件属性用在什么地方。**检测文件属性能用到的地方太多了。


我们来举例子:


1.我们在做软件安装的时候,大家会发现如果文件存在了,就跳转到了其他的地方。

2.如果在安装的过程当中,某些文件没有写入权限,就不让进行安装。


我们来举一个国内非常出名的软件,discuz的安装过程截图给大家看看:

1668337199622.jpg


上面的例子,就是典型的文件检测的用法。

我们来学习一下下面的**一批函数。**然后,我们来通过一个例子进行学习。
bool file_exists ( $指定文件名或者文件路径)
功能:文件是否存在。
bool is_readable ( $指定文件名或者文件路径)
功能:文件是否可读
bool is_writeable ( $指定文件名或者文件路径)
功能:文件是否可写
bool is_executable ( $指定文件名或者文件路径)
功能:文件是否可执行
bool is_file ( $指定文件名或者文件路径)
功能:是否是文件
bool is_dir ( $指定文件名或者文件路径)
功能:是否是目录
void clearstatcache ( void )
功能:清楚文件的状态缓存

上面的功能一看就清楚了。那实验,我们就来写这个最开始我们举的这个例子。


文件锁


我们来讲**第一个例子,文件锁。**如果已经安装了,存在安装锁就提示已安装,否则就继续安装。


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


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


检测文件或目录是否有写入或者读取权限


我们接下来做一个文件安装检测的实验来检测文件或目录是否有写入或者读取权限。如果没有则不能进行安装。


处理这件事情的思路如下:


1.定义一批需要检测权限的数组


2.可以检测是文件夹还是文件


3.做一个标置位变量,如果标置位变量一旦为false则不显示下一步的安装


<?php
//可以定义一批文件是否存在
$files = [
   'config.php',
   'img/',
   'uploads/',
];
//定义标志位变量
$flag = true;
foreach($files as  $v){
   echo $v;
   //判断是文件还是文件夹
   if(is_file($v)){
       echo '是一个文件&nbsp;&nbsp;&nbsp;&nbsp;';
   }else if(is_dir($v)){
       echo '是一个文件夹&nbsp;&nbsp;&nbsp;&nbsp;';
   }
   if(is_readable($v)){
       echo ' 可读';
   }else{
        echo '<font color="red">不可读</font>';
   }
   if(is_writeable($v)){
       echo '可写';
   }else{
       echo '<font color="red">不可写</font>';
   }
   echo '<br />';
}
if($flag){
   echo '<a href="step1">下一步</a>';
}else{
    echo '不能进行安装';
}
?>


通过上面的例子,我们就做到了。实现PHP某个软件安装过程当中的安装检测。


也就是我们上面思路的实现。


相关文章
|
8月前
|
存储 PHP
(MAC)PHP php.ini 配置文件
(MAC)PHP php.ini 配置文件
112 0
|
关系型数据库 MySQL 应用服务中间件
Centos中查看nginx、apache、php、mysql配置文件路径
Centos中查看nginx、apache、php、mysql配置文件路径
2169 0
|
10月前
|
存储 缓存 JSON
php开发实战分析(6):配置文件或缓存文件的生成与调用
php开发实战分析(6):配置文件或缓存文件的生成与调用
105 0
|
安全 关系型数据库 MySQL
某教程学习笔记(一):17、php漏洞
某教程学习笔记(一):17、php漏洞
74 0
某教程学习笔记(一):17、php漏洞
|
存储 程序员 PHP
PHP学习笔记(观隅反三)
PHP学习笔记(观隅反三)
59 0
PHP学习笔记(观隅反三)
|
PHP
PHP学习笔记(才贯二酉)
PHP学习笔记(才贯二酉)
95 0
PHP学习笔记(才贯二酉)
|
安全 PHP
PHP学习笔记(一往无前)(下)
PHP学习笔记(一往无前)(下)
93 0
PHP学习笔记(一往无前)(下)
|
Java 网络安全 PHP
PHP学习笔记(一往无前)(上)
PHP学习笔记(一往无前)(上)
71 0
PHP学习笔记(一往无前)(上)
|
安全 关系型数据库 MySQL
提升PHP安全:8个必须修改的PHP默认配置
提升PHP安全:8个必须修改的PHP默认配置
128 0