php学习笔记(十一)文件系统

11.1学习文件系统的步骤:

第一步:学习打开文件的方法。

第二步:学习读取,写入和操作文件的写法。

第三步:学习关闭文件的方法

 

11.2解析文件操作方法
11.2.1打开文件

resource fopen ( string filename,string mode [, bool use_include_path [, resource zcontext]] )

(1)fopen()filename 指定的名字资源绑定到一个流上。如果 filename 是 "scheme://..." 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。如果该协议尚未注册封装协议,PHP将发出一条消息来帮助检查脚本中潜在的问题并将 filename 当成一个普通的文件名继续执行下去。

如果 PHP 认为 filename 指定的是一个本地文件,将尝试在该文件上打开一个流。该文件必须是 PHP 可以访问的,因此需要确认文件访问权限允许该访问。如果激活了 安全模式 或者 open_basedir则会应用进一步的限制。

如果 PHP 认为 filename 指定的是一个已注册的协议,而该协议被注册为一个网络 URL,PHP 将检查并确认 allow_url_fopen已被激活。如果关闭了,PHP 将发出一个警告,而 fopen 的调用则失败。

mode 参数指定了所要求到该流的访问类型。可以是以下:

(2)表格 1. fopen() 中的 mode 的可能值列表

mode

说明

'r'

只读方式打开,将文件指针指向文件头。

'r+'

读写方式打开,将文件指针指向文件头。 在我为之前写入,就会覆盖原内容

'w'

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

'w+'

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

'a'

写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。

'a+'

读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。

'x'

创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。

'x+'

创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。

 

‘b’

二进制模式,用于与其他模式进行连接,如果文件系统能够区分二进制文件和文本文件可能会使用它,Windows区分二进制文件和文本文件,unix系统则不区分。这个是默认的模式

t

文本,这个模式与其他模式进行结合。这个模式只是windows系统下的一个选项。

 

 

注: 不同的操作系统家族具有不同的行结束习惯。当你写入一个文本文件并想插入一个新行时,你需要使用符合你操作系统的行结束符号。基于 Unix 的系统使用 \n 作为行结束字符,基于 Windows 的系统使用 \r\n 作为行结束字符,基于 Macintosh 的系统使用 \r 作为行结束字符。

如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。

Windows 下提供了一个文本转换标记('t')可以透明地将 \n 转换为 \r\n。与此对应你还可以使用 'b' 来强制使用二进制模式,这样就不会转换你的数据。要使用这些标记,要么用'b' 或者用 't' 作为 mode 参数的最后一个字符。

默认的转换模式依赖于 SAPI 和你使用的 PHP 版本,因此为了便于移植鼓励你总是指定恰当的标记。当操作以\n 作为行结束定界符的纯文本文件时,如果你还期望这些文件可以用于其它应用程序例如Notepad,则应该在脚本中使用 't' 模式。在所有其它情况下使用'b'

在操作二进制文件时如果没有指定 'b' 标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 \r\n 字符的奇怪问题。

注: 为移植性考虑,强烈建议在用 fopen() 打开文件时总是使用 'b' 标记。

(3)如果也需要在include_path中搜寻文件的话,可以将可选的第三个参数 use_include_path 设为 '1' 或 TRUE。这里的include_path是在php.ini文件中进行设置的。

eg:通过fopen()函数文件。

<?php

fopen("D:\\test.txt","w");

?>

我们就可以看到在这个目录下面出现了一个test.txt文件。

11.2.2读取文件

1.string fgetc( resource handle )

返回一个包含有一个字符的字符串,该字符从 handle 指向的文件中得到。碰到EOF 则返回 FALSE

文件指针必须是有效的,并且必须指向一个由 fopen()fsockopen()成功打开的文件。

Eg:逐个字符的读取指定的文件

<?php

 $fopen =fopen("D:\\test.txt","rb");

 while(false != ($char=fgetc($fopen))){   

   echo $char;

   echo "<br>";

 }

 fclose($fopen);

?>

 

Eg:输出结果

 

 

2.string fgets ( int handle[, int length] )

(1).从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说1024 字节。

文件指针必须是有效的,并且必须指向一个由 fopen()fsockopen()成功打开的文件。

(2).string fgetss( resource handle [, int length [, string allowable_tags]] )

fgets()相同,只除了 fgetss 尝试从读取的文本中去掉任何 HTML 和 PHP 标记。

可以用可选的第三个参数指定哪些标记不被去掉。

Eg:

Test.txt下面的文件内容

asdfadf <p>

2222222 <p>

33333333 <p>

44444

Code:

<?php

$fopen = fopen("D:\\test.txt","rb");

echo "fgets()输出结果";

while(!feof($fopen)){//使用feof()函数测试指针是否到了文件末尾

    echo fgets($fopen);

}

fclose($fopen);

?>

<br/>

<?php

echo "fgetss()输出结果";

$fopen = fopen("D:\\test.txt","rb");

while(!feof($fopen)){//使用feof()函数测试指针是否到了文件末尾

    echo fgetss($fopen);

}

fclose($fopen);

?>

 

 

Eg输出结果;

fgets()输出结果asdfadf

2222222

33333333

44444
fgetss()输出结果asdfadf 2222222 33333333 44444

 

3.string fread( int handle, int length )

fread() 从文件指针 handle 读取最多 length 个字节。

Eg:输出指定文件10个字节的数据

<?php

  $fopen =fopen("D:\\test.txt","rb");

  echo fread($fopen,10);

  fclose($fopen);

?>

Eg输出结果

asdfadf <p

(注:一个英文字符正好是一个字节)

 

4.

(1)int readfile( string filename [, bool use_include_path [, resource context]] )

读入一个文件并写入到输出缓冲。

返回从文件中读入的字节数。如果出错返回 FALSE 并且除非是以 @readfile() 形式调用,否则会显示错误信息。

Eg:

<?php

readfile("D:\\test.txt");

?>

Eg:输出结果

asdfadf

 

2222222

 

33333333

 

44444

(2).array file( string filename [, int use_include_path [, resource context]] )

readfile()一样,只除了 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败file() 返回FALSE

如果也想在 include_path中搜寻文件的话,可以将可选参数 use_include_path 设为 "1"。

Eg:输出文件

<?php

 $array = file("D:\\test.txt");

 foreach($array as $a){

   echo $a;

 }

?>

输出结果:

asdfadf

2222222

33333333

44444

(3)string file_get_contents( string filename [, bool use_include_path [, resource context [, int offset [,int maxlen]]]] )

 

file()一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回FALSE

file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。

注: 如果要打开有特殊字符的 URL (比如说有空格),就需要使用 urlencode()进行 URL 编码。

版本

说明

5.0.0

添加了对 context 的支持。

5.1.0

添加了 offsetmaxlen 参数。

Offset用于指定的位置开始读取长度为maxlen的内容。

 

11.2.3写入文件

1.int fwrite( resource handle, string string [, int length] )

fwrite -- 写入文件(可安全用于二进制文件)

fwrite()string 的内容写入 文件指针 handle 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。

(2).file_put_contents-- 将一个字符串写入文件

说明

int file_put_contents ( stringfilename, string data [, int flags [, resource context]] )

和依次调用 fopen()fwrite()以及 fclose()功能一样。

参数 data 可以是数组(但不能为多元数组),这就相当于 file_put_contents($filename,join('', $array))

自 PHP 5.1.0 起,data 参数也可以被指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream()函数。

参数

filename

要被写入数据的文件名

data

要写入的数据。类型可以是 stringarray或者是 stream 资源(如上面所说的那样).

flags

flags 可以是FILE_USE_INCLUDE_PATH, FILE_APPEND 和/或LOCK_EX (获得一个独占锁定),然而使用 FILE_USE_INCLUDE_PATH时要特别谨慎。

context

一个 context 资源

fwrite()与file_put_contents()函数执行文件的写入操作的区别;

fwrite()必须有fopen()和fcolse()函数的支持。

File_put_contents()函数似乎更强大,它整合了fopen().fwrite(),fclose();

 

Eg”利用file_put_contents()进行图片的读取

$pic = file_put_contents(‘image/bg_01.jpg’);

File_put_contents(‘imges/files.jpg’,$pic);

Echo “<img src=’images/files.jpg’>”

Eg:利用fwrite()进行文件的追加

<?php

$fopen = fopen("D:\\test.txt","ab");

$str = "098128301283091823";

fwrite($fopen,$str);

//readfile($fopen);

fclose($fopen);

?>

 

11.2.4 关闭文件

fclose(file);

 

如何锁定文件。

在向一个文本文件中进行写入数据时,需要先锁定文件。以防其他用户同时也修改这个文件的php中通过flock()函数实现文件的锁定。

flock() 操作的handle 必须是一个已经打开的文件指针。operation 可以是以下值之一:

要取得共享锁定(读取程序),将 operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。

要取得独占锁定(写入程序),将 operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。

要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。

如果你不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。\

Eg:

<?php
$fp = fopen("/tmp/lock.txt", "w+");

if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write somethinghere\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file!";
}

fclose($fp);

?>

11.3目录处理函数

目录是一种特殊的文件,既然是文件,同样必须先打开。然后在进行浏览操作,最后还要记得关闭。

11.3.1打开目录

Fopen()函数如果未找到指定的文件,那么就会自动创建这个文件,而打开目录函数opendir()却会抛出错误信息。这就是php提供的打开的目录的函数opendir();

path

要打开的目录路径

context

context 参数的说明见手册中的StreamsAPI 一章。

 

11.3.2 浏览目录

array scandir ( string directory [,int sorting_order [, resource context]] )

返回一个 array,包含有directory 中的文件和目录。

参数

directory

要被浏览的目录

sorting_order

默认的排序顺序是按字母升序排列。如果使用了可选参数 sorting_order(设为 1),则排序顺序是按字母降序排列。

context

context 参数的说明见手册中的StreamsAPI 一章。

 

Eg:输出指定目录下的文件的名

<?php

   $path = "D:\phpExercise";

   //判断是否是一个目录

   if(is_dir($path)){

       $dir = scandir($path);

       foreach($dir as $value){

           echo $value."<br>";

       }

   }else{

       echo "目录路径错误";

    }

?>

输出结果:

.
..
Date.php
Desktop
array.php
form.php
index_ok.php

 

11.3.3关闭

void closedir ( resource dir_handle)

关闭由 dir_handle 指定的目录流。流必须之前被 opendir()所打开。

Eg:文件,目录的创建删除。

mkdir()函数

新建一个目录

Rmdir()函数

删除目录,但是目录必须为空

Unlink()函数

删除文件,成功返回true,失败返回false

 

 

11.4文件上传,下载原理
11.4.1 控制上传文件—配置php.ini文件

Php中通过php.ini文件对上传文件进行控制,包括是否支持上传,上传文件的临时目录,上传文件的大小,指定执行的时间和指令分配的内存空间。

定位到php.ini中的file upload项。

1,file_uploads:如果为on,说明支持文件上传:如果为off,则不支持;

2,upload_tmp_dir:上传文件临时目录。在文件上传成功之前,文件首先存放在服务器端的临时目录中,多数使用系统默认的目录,但是也可以自行设置。

3,upload_max_filesize:服务器允许上传文件的最大值,以MB为单位。系统默认为2MB,如果网站需要上传超过2MB,就需要修改这个值。

 

Php.ini中的其他几个选项也是可能会影响到文件上传的。

max_execution_time:php指令所能执行的最长的时间。在选择超大文本上传的时候,一定要配置这个选项。

memory_limit:php中一个指定分配的内存空间,单位为MB。它的大小同样影响到超大文件的上传。

(注:(1).php.ini文件配置完成后,需要重新启动apache服务器,配置才能生效。

      (2).如果使用集成化的安装包来配置php开发环境,默认已经配置好了。

      (3).如果要是上传超大的文件,就有必要对php.ini进行修改。

在客户端对上传的文件进行控制。

这里的enctype=”multipary/form-data”:

 

11.4.2 判断上传文件-全局变$_FILES

接下来介绍一下$_FILES数组中每个元素的含义。

函数名

说明

$_FILE[filename][name]

存储文件的文件名

$_FILE[filename][size]

存储文件大小,单位为字节

$_FILE[filename][tmp_name]

存储文件在临时目录中使用的文件名,因为文件上传时首先要将其以临时文件的身份保存在临时目录中。

$_FILE[filename][type]

存储上传文件的类型。

$_FILE[filename][error]

存储和文件上传相关的错误代码,

0:表示没有任何错误,文件上传成功。

1:文件上传大小超出了限制的值

2:表示上传文件超出表单中max_file_size的值

3:表示文件只上传了一部分

4:表示没有上传任何文件

 

 

11.4.3 文件上传move_uploaded_file函数

为了防止潜在的攻击,对原本不能通过脚本交互的文件进行非法管理,可以先应用is_uploaded_file()函数判断指定的文件是否是通过http=post上传的。如果是,则返回true.

1.bool is_uploaded_file( string filename )

如果 filename 所给出的文件是通过 HTTP POST 上传的则返回 TRUE。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。

这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

2. bool move_uploaded_file (string filename, string destination )

本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。

如果 filename 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 FALSE

如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 FALSE。此外还会发出一条警告。

这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

11.4.4文件下载

通过http的方式下载文件。

1.void header ( string string [,bool replace [, int http_response_code]] )

 

header

(PHP 3, PHP 4, PHP 5)

header -- 发送一个原始 HTTP 标头

说明

void header( string string [, bool replace [, int http_response_code]] )

header() 函数用来发送一个原始HTTP 标头。有关HTTP 标头的更多内容见HTTP/1.1规范

可选参数 replace 指明是替换掉前一条类似的标头还是增加一条相同类型的标头。默认为替换,但如果将其设为FALSE 则可以强制发送多个同类标头。例如:

<?php
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>

第二个可选参数 http_response_code 强制将 HTTP 响应代码设为指定值(此参数是 PHP 4.3.0 新加的)。

有两种特殊的 header 调用。第一种是标头以字符串“HTTP/”(大小写不重要)开头的,可以用来确定要发送的 HTTP 状态码。例如,如果配置了 Apache 用 PHP 来处理找不到文件的错误处理请求(使用 ErrorDocument 指令),需要确保脚本产生了正确的状态码。

<?php
header("HTTP/1.0 404 Not Found")
?>

注: HTTP 状态码标头行总是第一个被发送到客户端,而并不管实际的 header() 调用是否是第一个。除非 HTTP 标头已经发送出去,任何时候都可以通过用新的状态行调用 header() 函数来覆盖原先的。

 

Eg:

这里将这个下载文件部署在服务器上,然后通过http:进行访问进行文件下载

 

<?php

   //(1)Content-Type设定下载的文件类型。

   header('Content-Type:text/application');

   //(2))content-Disposition对文件进行描述

   header('content-Disposition:attachment;filename="test.txt"');

   //(3)Content-Length设置下载文件的大小

   header('Content-Length:'.filesize('D:\\test.txt'));

   //(4)通过readfile()函数读取文件内容

   readfile("D:\\test.txt");

?>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值