PHP – file
一些基本的用法
basename — 返回路径中的文件名部分 dirname — 返回路径中的目录部分
file_exists — 检查文件或目录是否存在 is_dir — 判断给定文件名是否是一个目录 is_executable — 判断给定文件名是否可执行 is_file — 判断给定文件名是否为一个正常的文件 is_link — 判断给定文件名是否为一个符号连接 is_readable — 判断给定文件名是否可读 is_uploadedfile — 判断文件是否是通过 HTTP POST 上传的 is_writable — 判断给定的文件名是否可写 is_writeable — is_writable 的别名
chmod — 改变文件模式 * chown — 改变文件的所有者 chgrp — 改变文件所属的组 filegroup — 取得文件的组 fileowner — 取得文件的所有者 lchgrp — Changes group ownership of symlink lchown — Changes user ownership of symlink
copy — 拷贝文件 delete — 参见 unlink 或 unset unlink — 删除文件 rename — 重命名一个文件或目录 touch — 设定文件的访问和修改时间 umask — 改变当前的 umask, 不带参数表示设置 umask 为 0777 (只设置一次)
读写
fopen — 打开文件或者 URL
$fp = fopen ( $filename, ‘r‘ ); r: 读 (必须存在) r+: 读写, 如果写, 会被清空 (必须存在) w: 不存在则创建, 如果写, 会被清空 w+: 读写, 如果写, 会清空 a: 不存在则创建, 追加的写方式, 不会清空 a+: 读写, 不会清空
fclose($fp);
feof ($fp) 主要用来配合写操作
读函数
- fread() 最大一次性能读取 8k 长度的字节数, 所以不能一次性读取大文件去作下载.
优势在于, 操作更加灵活, 每次读取指定字节的内容, 用于下载时方便控制服务器的流量
$handle = fopen ( "http://www.example.com/" , "rb" ); $contents = ‘‘ ; while (! feof ( $handle )) { $contents .= fread ( $handle , 8192 ); } fclose ( $handle );
- readfile() 优势是能够一次性读取大文件, 不需要 PHP 预读到内存, 下载速度更快, 直接把文件的处理交由服务器.
缺点就是不能控制负载. 所以它是没有内存限制的, 如果遇到报内存错误, 先调用 ob_end_flush()之类的函数关闭缓冲区
$file = "test.png"; header (‘content-type: application/octet-stream‘); // 以二进制形式返回 header (‘accept-ranges: bytes‘); // 按照字节返回 header (‘accept-length: ‘.filesize($file)); // 告诉浏览器文件大小 header (‘content-disposition: attachment; filename=‘.basename($file)); // 客户端的对话框对应的文件名 ob_clean (); flush (); readfile ( $file );
- file_get_contents 也是没 readfile()快, 因为也是走了 php 的内存. 但是在读取小文本内容到字符串变量时,
这个函数最适合使用, 简单, 更快
$con = file_get_contents ( ‘/tmp/input.txt‘ );
- fgets() 是一次读取文件中的一行了, 再需要逐行处理文件的时候, 使用这个
注: fgetss 和 fgets() 相同,只除了 fgetss() 尝试从读取的文本中去掉任何 HTML 和 PHP 标记
$handle = @fopen ( "/tmp/inputfile.txt" , "r" ); if ( $handle ) { while (( $buffer = fgets ( $handle , 4096 )) !== false ) { echo $buffer ; } if (! feof ( $handle )) { echo "Error: unexpected fgets() fail\n" ; } fclose ( $handle ); }
写函数
fputs 是 fwrite 的别名 fwrite ($fp, $str) Windows 上 打开二进制文件时,fopen() 函数的 mode 参数要加上 ‘b‘
if ( fwrite ( $handle , $somecontent ) === FALSE ) { echo "不能写入到文件 $filename " ; exit; }
ftruncate ( $fp, $length ) # 注意 fp 要以 w 的方式打开
fileatime($filename) — 取得文件的上次访问时间 filectime($filename) — 取得文件的 inode 修改时间 filemtime($filename) — 取得文件修改时间 echo date(‘Y-m-d H‘, filemtime($file));
filesize — 取得文件大小
bytes (B)
filetype — 取得文件类型
fifo,char,dir,block,link,file 和 unknown
flock — 轻便的咨询文件锁定
bool flock ( $fp, int $operation [, int &$wouldblock ] ) $operation LOCK_SH 取得共享锁定 (读取的程序) LOCK_EX 取得独占锁定 (写入的程) LOCK_UN 释放锁定 (无论共享或独占)
link — 建立一个硬连接 linkinfo — 获取一个连接的信息 lstat — 给出一个文件或符号连接的信息 readlink — 返回符号连接指向的目标 symlink — 建立符号连接
fscanf ( $fp, $formatStr [, &$... ] ) sscanf ( $inputStr , $formatStr [, &$... ] )
目录操作
$dir = opendir (‘dirname‘); closedir ($dir); getcwd();
opendir();
readdir(); # 注意 使用 !== false, 还有 目录名称最后不会有 ‘/‘ 符号
if (is_dir( $dir )) { if ($dh = opendir ( $dir )) { while (( $file = readdir ( $dh )) !== false ) { echo "filename: $file : filetype: " . filetype ( $dir . $file ) . "\n" ; } closedir ( $dh ); } }
$files1 = scandir ( $dir ); # 如果是目录, 不会递归扫描, 没什么用 想用 ls
mkdir — 新建目录
mkdir($dirname, 0700); # 创建目录, 权限是 0700, 注意, 还要减去 umask mkdir(a/b/c/d, 0700, true); # 递归创建目录
rmdir — 删除目录 # 只能删除空目录
function rrmdir($src) { $dir = opendir($src); while(false !== ( $file = readdir($dir)) ) { if (( $file != ‘.‘ ) && ( $file != ‘..‘ )) { $full = $src . ‘/‘ . $file; if ( is_dir($full) ) { rrmdir($full); } else { unlink($full); } } } closedir($dir); rmdir($src); }
路径信息
realpath — 返回规范化的绝对路径名
chdir ( ‘/var/www/‘ ); echo realpath ( ‘./../../etc/passwd‘ ); # /etc/passwd
pathinfo — 返回文件路径的信息
$path_parts = pathinfo ( ‘/www/htdocs/inc/lib.inc.php‘ ); echo $path_parts [ ‘dirname‘ ], "\n" ; echo $path_parts [ ‘basename‘ ], "\n" ; echo $path_parts [ ‘extension‘ ], "\n" ; echo $path_parts [ ‘filename‘ ], "\n"; /www/htdocs/inc lib.inc.php php lib.inc
glob — 寻找与模式匹配的文件路径
foreach ( glob ( "*.txt" ) as $filename ) { echo " $filename size " . filesize ( $filename ) . "\n" ; }
sys_get_temp_dir() - 返回用于临时文件的目录
tempnam — 建立一个具有唯一文件名的文件, 返回的是文件名 (绝对路径)
string tempnam ( string $dir , string $prefix )
dir 不存在会在系统临时目录中生成一个文件
tmpfile — 建立一个临时文件, 文件关闭后, 自动被删除
$fp = tmpfile (); fwrite ( $fp , "writing to tempfile" ); fclose ( $fp );