文件系统概述
文件类型
PHP是以UNIX的文件系统为模型的,因此Windows系统中我们只能获得"file"、"dir"或者"unknown"三种文件类型。而UNIX系统中,可以获得"block"、"char"、"dir"、"fifo"、"file"、"link"和"unknown"7种类型。
使用filetype()函数获取文件的上述类型,该函数接受一个文件名作为参数,如果文件不存在将返回false。
is_file()判断给定的文件名是否为一个正常的文件。
is_dir()判断给定的文件名是否是一个目录。
is_link()判断给定的文件名是否是一个符号链接。
文件的属性
PHP的文件属性处理函数
clearstatcache()函数清除被PHP缓存的文件信息。对同一个文件名进行多次操作,并且需要该文件信息不被缓存时才需要调用它。
目录的基本操作
解析目录路径
UNIX系统中必须使用正斜线"/"作为路径分隔符,而windows系统中默认使用反斜线"\"作为路径分隔符,在程序中表示时还要将"\"转义,但也接受正斜线"/"作为分隔符的写法。建议使用正斜线"/"作为路径分隔符。
PHP内置常量DIRECTORY_SEPARATOR,其值为当前操作系统的默认文件路径分隔符。
basename()
返回路径中文件名部分。
1 2 3 4 5 |
|
dirname()
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
1 2 3 |
|
pathinfo()
返回一个关联数组,其中包括指定路径中的目录名、基本名、扩展名三部分。分别通过dirname、basename、extension来引用。
1 2 3 4 5 6 |
|
遍历目录
opendir()
用于打开指定目录,接受一个目录及目录名作为参数,函数返回值可供其他目录函数使用的目录句柄(资源类型)。如果该目录不存在或者没有访问权限,则返回false。
readdir()
读取指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数,函数返回当前目录指针位置的一个文件名,并将目录指针向后移动一位。当指针位于目录的结尾时,因为没有文件存在则返回false。
closedir()
关闭指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数。函数无返回值,运行后将关闭打开的目录。
rewinddir()
倒回目录句柄,接受已经用opendir()函数打开的可操作目录句柄作为参数。将目录指针重置到目录开始处,即倒回目录的开头。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
统计目录大小
disk_free_space()计算磁盘空闲容量大小。
disk_total_apace()计算磁盘大小。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
建立和删除目录
mkdir()创建一个新目录。rmdir()删除目录,只能删除一个空目录并且目录必须存在,如果是非空目录就需要先进入到目录中,使用unlink()函数将目录中的每个文件都删除掉,再回来将这个空目录删除。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
复制目录
首先对源目录进行遍历,如果遇到的是普通文件,直接使用copy进行赋值;如果遍历时遇到一个目录,则必须建立该目录,然后再对该目录下的文件进行复制操作,如果还有子目录,则使用递归重复操作,最终将整个目录复制完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
文件的基本操作
文件的打开与关闭
fopen()建立与文件资源的连接,fclose()关闭通过fopen函数打开的文件资源。
fopen()
- 第一个参数:需要被打开的文件URL。
- 第二个参数:文件操作模式
- 第三个参数是可选的,如果资源位于本地系统,php则认为可以使用本地路径或是相对路径来访问此资源。如果将这个参数设置为1,就会是php考虑配置指令include_path中指定的路径(在php的配置该文件中设置)。
- 第四个参数也是可选的。fopen()函数允许文件名称以协议名称开始。例如"http://"并且在一个远程位置打开该文件。通过设置这个参数,还可以支持一些其他的协议。
如果fopen()函数成功地打开一个文件,该函数将返回一个指向这个文件的文件指针。对该文件进行操作所使用的读、写一起其他的文件操作函数,都要使用这个资源来访问该文件。如果打开失败,则返回false。
fclose()
资源类型属于php的基本类型之一,一旦完成资源的处理,已定要将其关闭,否则可能会出现一些预料不到的错误。函数fclose()就会撤销fopen()打开的资源类型,成功时返回true,否则返回false。参数必须是使用fopen()或者fsocketopen()函数打开的已存的文件指针。在目录操作中opendir()函数也是开启一个资源,使用closedir()将其关闭。
写入文件
fwrite()函数就可以将字符串内容写入文件中。在文件中通过字符序列\n表示换行符,表示文件中一行的末尾。当需要一次输入或输出一行信息时。
- 第一个参数:需要打开的文件资源。
- 第二个参数:需要输入的字符串内容。
- 第三个参数:可选。将在输入length个字符串时停止。
1 2 3 4 5 6 7 8 9 10 11 |
|
读取文件内容
在读取文件时,不仅要注意行结束符号"\n",程序也需要一种标准的方式来识别何时到达文件的末尾,这个标准通常称为EOF(End Of File)字符。在PHP中,使用fepf()函数。该函数接受一个打开的文件资源,判断一个文件指针是否位于的结束出,如果在文件末尾处,则返回true。
fread()
用来在打开文件中读取指定长度的字符串。也可以安全用于二进制文件,在区分二进制文件和文本文件的系统上打开文件时。fopen()函数的mode参数要加上‘b‘。函数Fread()的原型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
如果只是讲一个文件的内容读入到另一个字符串中,可以用file_get_contents()函数,它的性能比上面的代码好得多。
fgets()、fgetc()
fgets()一次至多从打开的文件资源中读取一行内容。失败返回false。
第一个参数:打开的资源。
第二个参数:可选。length,返回length-1个字节。或者遇到换行或EOF之前读取的所有内容。如果忽略length,默认为1024个字符。
1 2 3 4 5 6 7 |
|
fgetc()再打开的文件资源中只读取当前指针位置处的一节字符。如果遇到文件结束标志EOF,将返回false值。
1 2 3 4 5 6 |
|
file()
可以把整个文件读入到一个数组中。数组中的每个元素对应文件中相应的行,各元素有换行符分隔,同事换行符仍附加在每个元素的末尾。这样,就可以使用数组的相关函数对文件内容进行处理。
readfile()
该函数可以读取指定的整个文件,立即输出缓冲区,并返回读取的字节数。该函数也不需要使用fopen()函数打开文件。
1 2 |
|
远程访问文件
如果需要访问远程文件,必须在PHP的配置文件中激活"allow_url_fopen"选项,才能使用fopen()函数打开远程文件,而且其他服务器具有访问权限。使用PHP访问远程文件就像访问本地文件一样,都是使用相同的读写函数处理。
如果有合法的访问权限,可以以一个用户的身份和某FTP服务器建立链接,这样就可以想改FTP服务器端的文件进行写操作了。可以用该技术来存储远程日志文件等操作,但仅能用该方法来创建新的文件,如果尝试覆盖已经存在的文件,fopen()函数的调用将会失败。而且要以匿名以外的用户名链接服务器,并需要指明用户名(甚至密码)。"ftp:user:[email protected]/root"。
为了避免由于访问远程主机时发生的超时错误,可以使用set_time_limit()函数对程序的运行时间加以限制。
移动文件指针
int ftell():
返回文件指针的当前位置的偏移量。
int fseek():
移动文件指针到第二个参数offset指定的位置。如果没有提供第三个可选参数whence,则位置将设置为从文件开头的offset字节处,否则,第三个可选参数whence可以设置为三个可能的值。
- SEEK_CUR:设置指针位置为当前位置加上第二个参数所提供的offset字节。
- SEEK_END:设置指针位置为EOF加上offset字节。在这里,offset必须设置为负值。
- SEEK_SET:设置指针位置为offset字节处。这与忽略第三个参数whence效果相同。
执行成功,返回0,失败则返回-1。如果将文件以追加模式"a"或"a+"打开,写入文件的任何数据总是会被附加在后面,不会管文件指针的位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
bool rewind():
移动文件指针到文件的开头。
文件的所定机制
flock()
可以对文件使用锁定机制(锁定或释放文件)。当一个进程早访问文件时加上锁,其他进程要想对该文件进行访问,必须等到锁定被释放以后。这样避免在兵法访问同一个文件时破坏数据。
第一个参数:一个已经打开的文件资源。
第二个参数:规定使用哪种锁定类型。值为以下:
- LOCK_SH取得共享锁定(从文件中读取数据时使用)。
- LOCK_EX取得独占锁定(像文件中写入数据时使用)。
- LOCK_UN释放锁定(无论何种锁定,均由此释放)。
- LOCK_NB附加锁定(如果不希望flock()在锁定时堵塞,则应在上述锁定后加上此锁)。
如果锁定会堵塞的话(已经被flock()锁定的文件,再次锁定时,flock()函数会被挂起,这时成为锁定堵塞),也可以将可选的第三个参数设置为1,则当进行锁定时会阻塞其他进程。锁定操作也可以被fclose()释放。为了让flock()函数发挥作用,在所有访问文件的程序中都必须使用相同的锁定文件。该函数如果成功则返回true,失败则返回false。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
|
文件的一些基本操作函数
文件的上传与下载
文件上传
客户端上传设置
如果支持文件上传操作,必须在<form>标签中将enctype和method两个属性指明相应的值。
- enctype="multipart/form-data"用来指定表单编码数据方式,让服务器知道,我们要传递一个文件,并带有常规的表单信息。
- method="POST"用来致命发送数据的方法。
另外,还需要在form表单中设置一个hidden类型的input框。其中name的值为MAX_FILE_SIZE的隐藏值域,并通过设置其VALUE的值限制上传文件的大小(单位字节),但这个值不能超过PHP的配置文件中upload_max_filesize值设置的大小。
1 2 3 4 5 |
|
在服务端通过php处理上传
要想通过PHP成功地管理文件上传,需要通过以下三方面信息:
- 设置PHP配置文件中的指令:用于精细地调节PHP的文件上传功能。
- $_FILES多维数组:用于存储各种与上传文件有关信息,其他数据还使用$_POST去接收。
- PHP的文件上传处理函数:用于上传文件的后续处理。
文件上传与PHP配置文件的设置有关,首先,应该设置php.ini文件中的一些指令,精细调节PHP的文件上传功能。在PHP配置文件php.ini中和上传文件有关的指令如下表:
除了上述,还有两个专门用于文件上传所使用的is_uploaded_file()和move_uploaded_file()两个函数。
is_uploaded_file()
判断指定的文件是否是通过HTTP POST上传的,如果是返回true。用于防止潜在的攻击者对原本不能通过脚本交互的文件进行非法管理,这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件。
move_uploaded_file()
文件上传后,首先会存储与服务器的临时目录中,可以使用该函数将上传的文件移动到新位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
文件下载
PHP使用header()函数发送网页的头部信息给浏览器,该函数接受一个头信息的字符串作为参数。文件下载需要发送的头信息包括以下三部分,通过调用三次header()函数完成,在使用readfile()函数将文件内容读取出来并直接输出。
1 2 3 4 5 6 7 8 9 |
|
文件上传类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |
|