PHP学习笔记——文件系统

一、文件处理
1、打开文件
resource fopen ( string filename , string mode [, bool use_include_path = false [, resource context ]] )
该函数打开文件或者 URL,将 filename 指定的名字资源绑定到一个流上。
如果 filename 是 “scheme://…” 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。如果该协议尚未注册封装协议,PHP 将发出一条消息来帮助检查脚本中潜在的问题并将 filename 当成一个普通的文件名继续执行下去。如果 PHP 认为 filename 指定的是一个本地文件,将尝试在该文件上打开一个流。该文件必须是 PHP 可以访问的,因此需要确认文件访问权限允许该访问。如果激活了安全模式或者 open_basedir 则会应用进一步的限制。在参数filename指定的文件名中,为了避免不同系统之间切换可能带来的麻烦,采用“\”作为路径分隔符。
如果 PHP 认为 filename 指定的是一个已注册的协议,而该协议被注册为一个网络 URL,PHP 将检查并确认 allow_url_fopen 已被激活。如果关闭了,PHP 将发出一个警告,而 fopen 的调用则失败。
mode 参数指定了所要求到该流的访问类型。可以是以下:
‘r’ - 只读方式打开,将文件指针指向文件头。
‘r+’ - 读写方式打开,将文件指针指向文件头,在现有文件内容的末尾之前进行写入就会覆盖原有内容。
‘w’ - 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建这个文件。
‘w+’ - 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建这个文件。
‘a’ - 追加(写)方式打开,将文件指针指向文件末尾。如果该文件已有内容,则从文件末尾开始追加;如果文件不存在则尝试创建这个文件。
‘a+’ - 追加(读写)方式打开,将文件指针指向文件末尾。如果该文件已有内容,则从文件末尾开始追加或者读取;如果文件不存在则尝试创建这个文件。
‘x’ - 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
‘x+’ - 创建并以读写方式打开,其他的行为和 ‘x’ 一样。
‘b’ - 二进制模式——用于与其他模式进行连接。如果文件系统能够区分二进制文件和文本文件,可能会使用它。Windows可以区分;Unix则不区分。推荐使用这个选项,便于获得最大程度的可移植性。它是默认模式。
‘t’ - 文本,用于与其他模式的结合,这个模式只是Windows下的一个选项。

注意,文本模式打开文件与二进制方式打开文件的不同点是:文件模式打开文件,操作系统会对内容进行转义,在Windows下,可以透明地将\n转换为\r\n;而以二进制方式打开文件,文件不经过操作系统预处理,读取的内容与文件在磁盘上保存的内容相同。不同的操作系统家族具有不同的行结束习惯。当写入一个文本文件并想插入一个新行时,需要使用符合操作系统的行结束符号。基于 Unix 的系统使用 \n 作为行结束字符,基于 Windows 的系统使用 \r\n 作为行结束字符,基于 Macintosh 的系统使用 \r 作为行结束字符。

可选参数use_include_path决定是否在include_path(由配置文件php.ini中的include_path参数进行设置)定义的目录中搜索filename文件,可将此参数设为 ‘1’ 或 TRUE。
可选资源型参数context称为上下文(在 PHP 5.0.0 中增加了对上下文(Context)的支持),是设置流操作的特定选项,用于控制流的操作特性。一般情况下只需使用默认的流操作设置,不需要使用此参数。

2、读取文件
1)读取一个字符(可安全用于二进制文件)
string fgetc ( resource handle )
从文件句柄中获取一个字符。
参数handle文件指针必须是有效的,必须指向由 fopen() 或 fsockopen() 成功打开的文件(并还未由 fclose() 关闭)。
返回一个包含有一个字符的字符串,该字符从 handle 指向的文件中得到。 碰到 EOF 则返回 FALSE。

2)从文件指针中读取一行
string fgets ( resource handle [, int length ] )
参数length是从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。从 PHP 4.3 开始,忽略掉 length 则行的长度被假定为 1024,将继续从流中读取数据直到行结束。如果文件中的大多数行都大于 8KB,则在脚本中指定最大行的长度在利用资源上更为有效。
从指针 handle 指向的文件中读取了 length - 1 字节后返回字符串。 如果文件指针中没有更多的数据了则返回 FALSE。错误发生时返回 FALSE。

3)从文件指针中读取一行并过滤掉 HTML 标记
string fgetss ( resource handle [, int length [, string allowable_tags ]] )
从文件指针中读取一行并过滤掉 HTML 标记和 PHP 标记。
可选参数allowable_tags指定哪些标记不被去掉。
从 handle 指向的文件中大读取 length - 1 个字节的字符,并过滤了所有的 HTML 和 PHP 代码。错误发生时返回 FALSE。

4)读取任意长度的字符串(可安全用于二进制文件)
string fread ( resource handle , int length )
fread() 从文件指针 handle 读取最多 length 个字节。 该函数读取了 length 个字节或到达了文件末尾(EOF)时停止读取文件。返回所读取的字符串, 或者在失败时返回 FALSE。

5)读取文件并写入到输出缓冲
int readfile ( string filename [, bool use_include_path = false [, resource context ]] )
readfile()函数用于读取一个文件并将其写入到输出缓冲。使用该函数,不需要打开/关闭文件,不需要“echo/print”等输出语句,直接写出文件路径即可。
参数filename是要读取的文件路径。
可选参数use_include_path是如果想要在 include_path 中搜索文件,设为 TRUE。
参数context 是Stream 上下文(context) resource。
返回从文件中读入的字节数。如果出错返回 FALSE 并且除非是以 @readfile() 形式调用,否则会显示错误信息。
注意,readfile() 自身不会导致任何内存问题。 如果出现内存不足的错误,使用 ob_get_level() 确保输出缓存已经关闭。

6)把整个文件读入一个数组中
array file ( string filename [, int flags = 0 [, resource context ]] )
读取整个文件的内容,将文件内容按行存放到一个数组中,包括换行符在内,如果失败则返回false。可以通过 file_get_contents() 以字符串形式获取文件的内容。
参数filename是文件的路径。
可选参数 flags 可以是以下一个或多个常量:
FILE_USE_INCLUDE_PATH (在 include_path 中查找文件)
FILE_IGNORE_NEW_LINES(在数组每个元素的末尾不要添加换行符 )
FILE_SKIP_EMPTY_LINES(跳过空行 )

7)将整个文件读入一个字符串(可安全用于二进制对象)
string file_get_contents ( string filename [, bool use_include_path = false [, resource context [, int offset = -1 [, int maxlen ]]]] )
将文件内容读入一个字符串,如果有offset和maxlen参数,将在参数offset(不支持远程文件)所指定的位置开始读取长度为maxlen的内容。如果失败,返回false。file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。

3、写入文件
1)写入文件(可安全用于二进制文件)
int fwrite ( resource handle , string string [, int length ] )
把 string 的内容写入 文件指针 handle 处。fwrite()函数还有个别名叫fputs()。
可选参数 length如果指定了,当写入了 length 个字节或者写完了 string 以后,写入就会停止,看先碰到哪种情况。注意如果给出了 length 参数,则 magic_quotes_runtime 配置选项将被忽略,而 string 中的斜线将不会被抽去。
返回写入的字符数,出现错误时则返回 FALSE 。

2)将一个字符串写入文件(可安全用于二进制对象)
int file_put_contents ( string filename , mixed data [, int flags = 0 [, resource context ]] )
和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。 如果文件不存在,将会被创建;如果文件存在且没有设置 FILE_APPEND 标志,文件将被重写。该函数将返回写入到文件内数据的字节数,失败时返回FALSE。
参数filename是要被写入数据的文件名。
参数data是要写入的数据,类型可以是 string,array 或者是 stream 资源。如果 data 指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。 参数 data 可以是数组(但不能为多维数组),这就相当于 file_put_contents($filename, join(’’, $array))。
参数flags 的值可以是 以下 flag 使用 OR (|) 运算符进行的组合:
FILE_USE_INCLUDE_PATH (在 include 目录里搜索 filename。 更多信息可参见 include_path)
FILE_APPEND (如果文件 filename 已经存在,追加数据而不是覆盖)
LOCK_EX (在写入时获得一个独占锁)

4、操作文件
1)拷贝文件
bool copy ( string source , string dest [, resource context ] )
将文件从 source 拷贝到 dest。如果要移动文件的话,请使用 rename() 函数。成功时返回 TRUE, 或者在失败时返回 FALSE。
参数source是源文件路径。
参数dest是目标路径,如果 dest 是一个 URL,则如果封装协议不支持覆盖已有的文件时拷贝操作会失败。如果目标文件已存在,将会被覆盖。

2)重命名一个文件或目录
bool rename ( string oldname , string newname [, resource context ] )
尝试把 oldname 重命名为 newname。成功时返回 TRUE, 或者在失败时返回 FALSE。
参数oldname是旧的名字,用于 oldname 中的封装协议必须和用于 newname 中的相匹配。
参数newname是新的名字。

3)删除文件
bool unlink ( string filename [, resource context ] )
删除 filename。和 Unix C 的 unlink() 函数相似。 发生错误时会产生一个 E_WARNING 级别的错误。成功时返回 TRUE, 或者在失败时返回 FALSE。

4)取得文件的上次访问时间
int fileatime ( string filename )
返回文件上次被访问的时间, 或者在失败时返回 FALSE。时间以 Unix 时间戳的方式返回。
注意:一个文件的 atime 应该在不论何时读取了此文件中的数据块时被更改。当一个应用程序定期访问大量文件或目录时很影响性能。有些 Unix 文件系统可以在加载时关闭 atime 的更新以提高这类程序的性能。USENET 新闻组假脱机是一个常见的例子。在这种文件系统下本函数没有用处。不同文件系统对时间的判断方法可能是不相同的。此函数的结果会被缓存,参见 clearstatcache() 以获得更多细节。

5)取得文件修改时间
int filemtime ( string filename )
返回文件上次被修改的时间, 或者在失败时返回 FALSE。时间以 Unix 时间戳的方式返回,可用于 date()。注意:不同文件系统对时间的判断方法可能是不相同的。此函数的结果会被缓存。

6)取得文件大小
int filesize ( string filename )
返回文件大小的字节数,如果出错返回 FALSE 并生成一条 E_WARNING 级的错误。因为 PHP 的整数类型是有符号整型而且很多平台使用 32 位整型,对 2GB 以上的文件,一些文件系统函数可能返回无法预期的结果 。

7)获取文件路径的信息
mixed pathinfo ( string path [, int options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )
返回一个关联数组包含有 path 的信息。返回关联数组还是字符串取决于 options。 如果没有传入 options ,将会返回包括以下单元的数组 array:dirname,basename 和 extension(如果有),以 及filename。
参数path是要解析的路径。
参数options如果指定了,将会返回指定元素,它们包括:PATHINFO_DIRNAME,PATHINFO_BASENAME 和 PATHINFO_EXTENSION 或 PATHINFO_FILENAME。 如果没有指定 options 默认是返回全部的单元。

8)获取规范化的绝对路径名
string realpath ( string $path )
realpath() 扩展所有的符号连接并且处理输入的 path 中的 ‘/./’, ‘/…/’ 以及多余的 ‘/’ 并返回规范化后的绝对路径名,返回的路径中没有符号连接,’/./’ 或 ‘/…/’ 成分,失败时返回 FALSE。在 Windows 上,realpath() 会将 unix 风格的路径改成 Windows 风格的。

9)给出文件的信息
array stat ( string filename )
获取由 filename 指定的文件的统计信息。如果 filename 是符号连接,则统计信息是关于被连接文件本身的,而不是符号连接。 如果出错,stat() 返回 FALSE。注意, 因为 PHP 的整数类型是有符号整型而且很多平台使用 32 位整型,对 2GB 以上的文件,一些文件系统函数可能返回无法预期的结果 。lstat()函数和 stat() 函数相同,只除了如果 filename 参数是符号连接的话,则该符号连接的状态被返回,而不是该符号连接所指向的文件的状态。
PHP学习笔记——文件系统_第1张图片10)关闭一个已打开的文件指针
bool fclose ( resource handle )
将 handle 指向的文件关闭。handle文件指针必须有效,并且是通过 fopen() 或 fsockopen() 成功打开的。成功时返回 TRUE, 或者在失败时返回 FALSE。

11)文件上传
bool move_uploaded_file ( string filename , string destination )
本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。
参数filename指定上传文件的临时文件名,即$_FILES[tmp_name];参数destination指定文件上传后保持的新路径和名称。
成功时返回 TRUE。如果 filename 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 FALSE。如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 FALSE。此外还会发出一条警告。如果目标文件已经存在,将会被覆盖。
注意,move_uploaded_file() 对安全模式和 open_basedir 都是敏感的。不过,限制只针对 destination 路径,因为允许移动上传的文件名 filename 可能会与这些限制产生冲突。move_uploaded_file() 仅作用于通过 PHP 上传的文件以确保这个操作的安全性。

5、文件指针
1)倒回文件指针的位置
bool rewind ( resource handle )
将 handle 的文件位置指针设为文件流的开头。如果将文件以附加(“a” 或者 “a+”)模式打开,写入文件的任何数据总是会被附加在后面,不管文件指针的位置。成功时返回 TRUE, 或者在失败时返回 FALSE。
参数handle文件指针必须合法,并且指向由 fopen() 成功打开的文件。

2)在文件指针中定位
int fseek ( resource handle , int offset [, int whence = SEEK_SET ] )
在与 handle 关联的文件中设定文件指针位置。 新位置从文件头开始以字节数度量,是以 whence 指定的位置加上 offset。成功则返回 0;否则返回 -1。注意移动到 EOF 之后的位置不算错误。
参数handle是典型地由 fopen() 创建的 resource(资源)。
参数offset是指针位置或相对whence参数的偏移量,可以是负值。要移动到文件尾之前的位置,需要给 offset 传递一个负值,并设置 whence 为 SEEK_END。
参数whence的值有:
SEEK_SET - 设定位置等于 offset 字节。
SEEK_CUR - 设定位置为当前位置加上 offset。
SEEK_END - 设定位置为文件尾加上 offset。

3)测试文件指针是否到了文件结束的位置
bool feof ( resource handle )
如果文件指针到了 EOF 则返回 TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE。

4)文件指针读/写的位置
int ftell ( resource handle )
返回由 handle 指定的文件指针的位置,也就是文件流中的偏移量。handle文件指针必须是有效的,且必须指向一个通过 fopen() 或 popen() 成功打开的文件。在附加模式(加参数 “a” 打开文件)中 ftell() 会返回未定义错误。

6、锁定文件
在向一个文本文件写入内容时,需要先锁定该文件,以防其他用户同时也修改此文件。
bool flock ( resource handle , int operation [, int &wouldblock ] )
flock() 允许执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是 Windows)。在 PHP 5.3.2版本之前,锁也会被 fclose() 释放(在脚本结束后会自动调用)。PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。 默认情况下,这个函数会阻塞到获取锁;这可以通过下面文档中 LOCK_NB 选项来控制(在非 Windows 平台上)。成功时返回 TRUE, 失败时返回 FALSE。
参数handle是文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
参数operation 可以是以下值之一:
LOCK_SH取得共享锁定(读取的程序)。
LOCK_EX 取得独占锁定(写入的程序。
LOCK_UN 释放锁定(无论共享或独占)。
LOCK_NB防止flock()函数在锁定时堵塞。
如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB(Windows 上还不支持)。
如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选参数wouldblock会被设置为 TRUE。(Windows 上不支持)

二、修改php.ini的配置
1、实现上传功能,首先要在php.ini中开启文件上传,配置完后,需重启apache服务器。
file_uploads:如果值是on,说明服务器支持文件上传;如果为off,则不支持。
upload_tmp_dir:上传文件临时目录。在文件被成功上传之前,文件首先存放在服务器端的临时目录中。如果要指定位置,就在这里进行设置,否则使用系统默认目录即可。
upload_max_filesize:服务器允许上传文件的最大值,以MB为单位。系统默认为2MB,用户可以自行设置。
max_execution_time:PHP中一个指令所能执行 的最大时间,单位是秒。
memory_limit:PHP中一个指令所分配的内存空间,单位是MB。

2、预定义变量$_FILES
该变量存储的是上传文件的相关信息,是一个二维数组,其保存的信息如下图:
PHP学习笔记——文件系统_第2张图片3、远程文件的访问
如果要访问远程文件,需将php.ini在的参数allow_url_fopen设置为on(默认是开启的),允许打开http协议和ftp协议指定的远程文件。如果allow_url_fopen设置为off,则不允许打开远程文件,函数将返回false。

三、目录操作
1、打开目录
resource opendir ( string path [, resource context ] )
打开一个目录句柄,可用于之后的 closedir(),readdir() 和 rewinddir() 调用中。 如果成功则返回目录句柄的 resource,失败则返回 FALSE。如果 path 不是一个合法的目录或者因为权限限制或文件系统错误而不能打开目录,opendir() 返回 FALSE 并产生一个 E_WARNING 级别的 PHP 错误信息。可以在 opendir() 前面加上“@”符号来抑制错误信息的输出。
参数path是要打开的目录路径 。
参数context是上下文。

2、浏览目录
array scandir ( string directory [, int sorting_order [, resource context ]] )
列出指定路径中的文件和目录,返回一个 array,包含有 directory 中的文件和目录。成功则返回包含有文件名的 array,如果失败则返回 FALSE。如果 directory 不是个目录,则返回布尔值 FALSE 并生成一条 E_WARNING 级的错误。
参数directory是要被浏览的目录
可选参数sorting_order指定排序顺序,默认的排序顺序是按字母升序排列。如果sorting_order设为 1,则排序顺序是按字母降序排列。

3、操作目录
1)新建目录
bool mkdir ( string pathname [, int mode = 0777 [, bool recursive = false [, resource context ]]] )
尝试新建一个由 pathname 指定的目录。成功时返回 TRUE, 失败时返回 FALSE。
可选参数mode mode默认的 mode 是 0777,意味着最大可能的访问权。注意 mode 不会被自动当成八进制数值,而且也不能用字符串(例如 “g+w”)。要确保正确操作,需要给 mode 前面加上 0。mode 参数包含三个八进制数按顺序分别指定了所有者、所有者所在的组以及所有人的访问限制。每一部分都可以通过加入所需的权限来计算出所要的权限。数字 1 表示使文件可执行,数字 2 表示使文件可写,数字 4 表示使文件可读。加入这些数字来制定所需要的权限。有关 UNIX 系统的文件权限可以阅读手册“man 1 chmod”和“man 2 chmod”。注意,mode 在 Windows 下被忽略。
参数recursive是否允许递归创建由 pathname 所指定的多级嵌套目录。

2)删除目录
bool rmdir ( string dirname [, resource context ] )
尝试删除 dirname 所指定的目录。 该目录必须是空的,而且要有相应的权限。 失败时会产生一个 E_WARNING 级别的错误。成功时返回 TRUE, 失败时返回 FALSE。

3)获取当前工作目录
string getcwd ( void )
成功则返回当前工作目录,失败返回 FALSE。在某些 Unix 的变种下,如果任何父目录没有设定可读或搜索模式,即使当前目录设定了,getcwd() 还是会返回 FALSE。

4)改变目录
bool chdir ( string directory )
将 PHP 的当前目录改为 directory。成功时返回 TRUE, 失败时返回 FALSE。

5)获取目录中的可用空间
float disk_free_space ( string directory )
本函数将根据相应的文件系统或磁盘分区返回可用的字节数。以浮点返回可用的字节数, 或者在失败时返回 FALSE。
参数 directory是文件系统目录或者磁盘分区。注意,如果指定了文件名而不是文件目录,这个函数的行为将并不统一,会因操作系统和 PHP 版本而异。此函数不能作用于远程文件,被检查的文件必须是可通过服务器的文件系统访问的。该函数的别名是diskfreespace()。

6)获取一个目录的磁盘总大小
float disk_total_space ( string directory )
给出一个包含有一个目录的字符串,本函数将根据相应的文件系统或磁盘分区返回所有的字节数。本函数返回的是该目录所在的磁盘分区的总大小,因此在给出同一个磁盘分区的不同目录作为参数所得到的结果完全相同。 在 Unix 和 Windows 200x/XP 中都支持将一个磁盘分区加载为一个子目录,这时正确使用本函数就很有意义。以浮点返回一个目录的磁盘总大小字节数, 或者在失败时返回 FALSE。此函数不能作用于远程文件,被检查的文件必须是可通过服务器的文件系统访问的。

7)从目录句柄中读取条目
string readdir ([ resource dir_handle ] )
返回目录中下一个文件的文件名,文件名以在文件系统中的排序返回,失败时返回 FALSE。
参数dir_handle是目录句柄的 resource,之前由 opendir() 打开 。

8)倒回目录句柄
void rewinddir ( resource dir_handle )
将 dir_handle 指定的目录流重置到目录的开头。
参数dir_handle是目录句柄的 resource,之前由 opendir() 打开 。

9)关闭目录句柄
void closedir ([ resource dir_handle ] )
关闭由 dir_handle 指定的目录流。流必须之前被 opendir() 所打开。
参数dir_handle是目录句柄的 resource,之前由 opendir() 所打开的。如果目录句柄没有指定,那么会假定为是opendir()所打开的最后一个句柄。

你可能感兴趣的:(编程知识)