正文
常用示例
// 判断目录是否存在
is_dir('/tmp');
// 获取当前工作目录
echo getcwd() . "\n"; // /home/vincent
// 切换到指定位置
chdir('/tmp');
// 创建文件夹
mkdir("/tmp/test/dev", 0700, true);
// 删除文件夹
rmdir('/tmp/test/dev');
// 创建文件
$fp = fopen("/tmp/test/dev/index.php", "w"); // w是写入模式,文件不存在则创建文件写入。
$len = fwrite($fp, '测试');
fclose($fp);
// 删除文件
unlink("/tmp/test/dev/index.php");
// 建立符号连接
symlink("/tmp/test/dev/index.php", "/tmp/index");
echo readlink("/tmp/index");
将图片流存为图片文件
<?php
//将图片流写入图片文件
$image = file_get_contents('abc.png');
if (@$fp = fopen('def.png', 'w+')) {
fwrite($fp, $image);
fclose($fp);
}
文件系统函数
basename — 返回路径中的文件名部分
chgrp — 改变文件所属的组
chmod — 改变文件模式
chown — 改变文件的所有者
clearstatcache — 清除文件状态缓存
copy — 拷贝文件
delete — 参见 unlink 或 unset
dirname — 返回路径中的目录部分
disk_free_space — 返回目录中的可用空间
disk_total_space — 返回一个目录的磁盘总大小
diskfreespace — disk_free_space 的别名
fclose — 关闭一个已打开的文件指针
feof — 测试文件指针是否到了文件结束的位置
fflush — 将缓冲内容输出到文件
fgetc — 从文件指针中读取字符
fgetcsv — 从文件指针中读入一行并解析 CSV 字段
fgets — 从文件指针中读取一行
fgetss — 从文件指针中读取一行并过滤掉 HTML 标记
file_exists — 检查文件或目录是否存在
file_get_contents — 将整个文件读入一个字符串
file_put_contents — 将一个字符串写入文件
file — 把整个文件读入一个数组中
fileatime — 取得文件的上次访问时间
filectime — 取得文件的 inode 修改时间
filegroup — 取得文件的组
fileinode — 取得文件的 inode
filemtime — 取得文件修改时间
fileowner — 取得文件的所有者
fileperms — 取得文件的权限
filesize — 取得文件大小
filetype — 取得文件类型
flock — 轻便的咨询文件锁定
fnmatch — 用模式匹配文件名
fopen — 打开文件或者 URL
fpassthru — 输出文件指针处的所有剩余数据
fputcsv — 将行格式化为 CSV 并写入文件指针
fputs — fwrite 的别名
fread — 读取文件(可安全用于二进制文件)
fscanf — 从文件中格式化输入
fseek — 在文件指针中定位
fstat — 通过已打开的文件指针取得文件信息
ftell — 返回文件指针读/写的位置
ftruncate — 将文件截断到给定的长度
fwrite — 写入文件(可安全用于二进制文件)
glob — 寻找与模式匹配的文件路径
is_dir — 判断给定文件名是否是一个目录
is_executable — 判断给定文件名是否可执行
is_file — 判断给定文件名是否为一个正常的文件
is_link — 判断给定文件名是否为一个符号连接
is_readable — 判断给定文件名是否可读
is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
is_writable — 判断给定的文件名是否可写
is_writeable — is_writable 的别名
lchgrp — 修改符号链接的所有组
lchown — 修改符号链接的所有者
link — 建立一个硬连接
linkinfo — 获取一个连接的信息
lstat — 给出一个文件或符号连接的信息
mkdir — 新建目录
move_uploaded_file — 将上传的文件移动到新位置
parse_ini_file — 解析一个配置文件
parse_ini_string — 解析配置字符串
pathinfo — 返回文件路径的信息
pclose — 关闭进程文件指针
popen — 打开进程文件指针
readfile — 输出文件
readlink — 返回符号连接指向的目标
realpath_cache_get — 获取真实目录缓存的详情
realpath_cache_size — 获取真实路径缓冲区的大小
realpath — 返回规范化的绝对路径名
rename — 重命名一个文件或目录
rewind — 倒回文件指针的位置
rmdir — 删除目录
set_file_buffer — stream_set_write_buffer 的别名
stat — 给出文件的信息
symlink — 建立符号连接
tempnam — 建立一个具有唯一文件名的文件
tmpfile — 建立一个临时文件
touch — 设定文件的访问和修改时间
umask — 改变当前的 umask
unlink — 删除文件
预定义常量
下列常量由此扩展定义,且仅在此扩展编译入 PHP 或在运行时动态载入时可用。
SEEK_SET (integer)
SEEK_CUR (integer)
SEEK_END (integer)
LOCK_SH (integer)
LOCK_EX (integer)
LOCK_UN (integer)
LOCK_NB (integer)
GLOB_BRACE (integer)
GLOB_ONLYDIR (integer)
GLOB_MARK (integer)
GLOB_NOSORT (integer)
GLOB_NOCHECK (integer)
GLOB_NOESCAPE (integer)
GLOB_AVAILABLE_FLAGS (integer)
PATHINFO_DIRNAME (integer)
PATHINFO_BASENAME (integer)
PATHINFO_EXTENSION (integer)
PATHINFO_FILENAME (integer)
自 PHP 5.2.0 起
FILE_USE_INCLUDE_PATH (integer)
在 include_path 里搜索 filename。
FILE_NO_DEFAULT_CONTEXT (integer)
FILE_APPEND (integer)
为存在的文件添加内容。
FILE_IGNORE_NEW_LINES (integer)
过滤换行(EOL)字符。
FILE_SKIP_EMPTY_LINES (integer)
过滤空行。
FILE_BINARY (integer)
二进制模式(自 PHP 5.2.7 起)。
注意:
此常量无效,仅仅用于向后兼容(forward compatibility)。
FILE_TEXT (integer)
文本模式 (自 PHP 5.2.7 起)。
注意:
此常量无效,仅仅用于向后兼容(forward compatibility)。
INI_SCANNER_NORMAL (integer)
普通的 INI 扫描模式(自 PHP 5.3 起)。
INI_SCANNER_RAW (integer)
原始(Raw) INI 扫描模式(自 PHP 5.3 起)。
INI_SCANNER_TYPED (integer)
Typed INI 扫描模式(自 PHP 5.5.6.1 起)。
FNM_NOESCAPE (integer)
禁用反斜线转义
FNM_PATHNAME (integer)
字符串里的斜杠只匹配指定模式里的斜杠。
FNM_PERIOD (integer)
字符串里的起始点号必须完全匹配指定模式里的点号。
FNM_CASEFOLD (integer)
大小写不敏感的匹配,GNU 扩展的一部分。
部分解说
文件夹部分
is_dir — 判断给定文件名是否是一个目录
mkdir — 新建目录
rmdir — 删除目录
rename — 重命名一个文件或目录
dirname — 返回路径中的目录部分
basename — 返回路径中的文件名部分
file_exists — 检查文件或目录是否存在
pathinfo — 返回文件路径的信息
realpath_cache_get — 获取真实目录缓存的详情
realpath_cache_size — 获取真实路径缓冲区的大小
文件部分
file_put_contents写入文件
int file_put_contents ( string $文件路径, string $写入数据])
原型:
/**
* Write a string to a file
* @link https://php.net/manual/en/function.file-put-contents.php
* @param string $filename <p>
* Path to the file where to write the data.
* </p>
* @param mixed $data <p>
* The data to write. Can be either a string, an
* array or a stream resource.
* </p>
* <p>
* If data is a stream resource, the
* remaining buffer of that stream will be copied to the specified file.
* This is similar with using stream_copy_to_stream.
* </p>
* <p>
* You can also specify the data parameter as a single
* dimension array. This is equivalent to
* file_put_contents($filename, implode('', $array)).
* </p>
* @param int $flags [optional] <p>
* The value of flags can be any combination of
* the following flags (with some restrictions), joined with the binary OR
* (|) operator.
* </p>
* <p>
* <table>
* Available flags
* <tr valign="top">
* <td>Flag</td>
* <td>Description</td>
* </tr>
* <tr valign="top">
* <td>
* FILE_USE_INCLUDE_PATH
* </td>
* <td>
* Search for filename in the include directory.
* See include_path for more
* information.
* </td>
* </tr>
* <tr valign="top">
* <td>
* FILE_APPEND
* </td>
* <td>
* If file filename already exists, append
* the data to the file instead of overwriting it. Mutually
* exclusive with LOCK_EX since appends are atomic and thus there
* is no reason to lock.
* </td>
* </tr>
* <tr valign="top">
* <td>
* LOCK_EX
* </td>
* <td>
* Acquire an exclusive lock on the file while proceeding to the
* writing. Mutually exclusive with FILE_APPEND.
* </td>
* </tr>
* </table>
* </p>
* @param resource $context [optional] <p>
* A valid context resource created with
* stream_context_create.
* </p>
* @return int|false The function returns the number of bytes that were written to the file, or
* false on failure.
*/
function file_put_contents ($filename, $data, $flags = 0, $context = null) {}
功能:向指定的文件当中写入一个字符串(会清空原有的内容),如果文件不存在则创建文件。返回的是写入的字节长度。
示例:
$data = "学好PHP";
$numbytes = file_put_contents('test.txt', $data);
if ($numbytes) {
echo '写入成功,我们读取看看结果试试:';
echo file_get_contents('test.txt');
} else {
echo '写入失败或者没有权限,注意检查';
}
fwrite配合fopen进行写入操作
$fp = fopen("/tmp/test/dev/index.php", "w"); // w是写入模式,文件不存在则创建文件写入。
$len = fwrite($fp, '测试');
fclose($fp);
echo $len .'字节被写入了\n';
总结:1.不论有没有新建都会打开文件重新写入;2.原有的文件内容会被覆盖掉;3.文件不存在会创建。
模式 | 说明 |
---|---|
r | 只可以读,不能使用fwrite写 |
r+ | 可读可写 |
w | 只可以写,从头写入方式 |
w+ | 可读可写 |
a | 只可以写功能,每次写入都会向文件的尾端追加内容 |
a+ | 可读可写,每次写入都会向文件的尾端追加内容 |
x | 只可以写,文件不存在都会创建,文件存在则报错 |
x+ | 可读可写,文件不存在都会创建,文件存在则报错 |
函数原型:
/**
* Opens file or URL
* @link https://php.net/manual/en/function.fopen.php
* @param string $filename <p>
* If filename is of the form "scheme://...", it
* is assumed to be a URL and PHP will search for a protocol handler
* (also known as a wrapper) for that scheme. If no wrappers for that
* protocol are registered, PHP will emit a notice to help you track
* potential problems in your script and then continue as though
* filename specifies a regular file.
* </p>
* <p>
* If PHP has decided that filename specifies
* a local file, then it will try to open a stream on that file.
* The file must be accessible to PHP, so you need to ensure that
* the file access permissions allow this access.
* If you have enabled &safemode;,
* or open_basedir further
* restrictions may apply.
* </p>
* <p>
* If PHP has decided that filename specifies
* a registered protocol, and that protocol is registered as a
* network URL, PHP will check to make sure that
* allow_url_fopen is
* enabled. If it is switched off, PHP will emit a warning and
* the fopen call will fail.
* </p>
* <p>
* The list of supported protocols can be found in . Some protocols (also referred to as
* wrappers) support context
* and/or &php.ini; options. Refer to the specific page for the
* protocol in use for a list of options which can be set. (e.g.
* &php.ini; value user_agent used by the
* http wrapper).
* </p>
* <p>
* On the Windows platform, be careful to escape any backslashes
* used in the path to the file, or use forward slashes.
* </p>
* <pre>
* <?php
* $handle = fopen("c:\\folder\\resource.txt", "r");
* ?>
* </pre>
* @param string $mode <p>
* The mode parameter specifies the type of access
* you require to the stream. It may be any of the following:
* <table>
* A list of possible modes for fopen
* using mode
* <tr valign="top">
* <td>mode</td>
* <td>Description</td>
* </tr>
* <tr valign="top">
* <td>'r'</td>
* <td>
* Open for reading only; place the file pointer at the
* beginning of the file.
* </td>
* </tr>
* <tr valign="top">
* <td>'r+'</td>
* <td>
* Open for reading and writing; place the file pointer at
* the beginning of the file.
* </td>
* </tr>
* <tr valign="top">
* <td>'w'</td>
* <td>
* Open for writing only; place the file pointer at the
* beginning of the file and truncate the file to zero length.
* If the file does not exist, attempt to create it.
* </td>
* </tr>
* <tr valign="top">
* <td>'w+'</td>
* <td>
* Open for reading and writing; place the file pointer at
* the beginning of the file and truncate the file to zero
* length. If the file does not exist, attempt to create it.
* </td>
* </tr>
* <tr valign="top">
* <td>'a'</td>
* <td>
* Open for writing only; place the file pointer at the end of
* the file. If the file does not exist, attempt to create it.
* </td>
* </tr>
* <tr valign="top">
* <td>'a+'</td>
* <td>
* Open for reading and writing; place the file pointer at
* the end of the file. If the file does not exist, attempt to
* create it.
* </td>
* </tr>
* <tr valign="top">
* <td>'x'</td>
* <td>
* Create and open for writing only; place the file pointer at the
* beginning of the file. If the file already exists, the
* fopen call will fail by returning false and
* generating an error of level E_WARNING. If
* the file does not exist, attempt to create it. This is equivalent
* to specifying O_EXCL|O_CREAT flags for the
* underlying open(2) system call.
* </td>
* </tr>
* <tr valign="top">
* <td>'x+'</td>
* <td>
* Create and open for reading and writing; place the file pointer at
* the beginning of the file. If the file already exists, the
* fopen call will fail by returning false and
* generating an error of level E_WARNING. If
* the file does not exist, attempt to create it. This is equivalent
* to specifying O_EXCL|O_CREAT flags for the
* underlying open(2) system call.
* </td>
* </tr>
* </table>
* </p>
* <p>
* Different operating system families have different line-ending
* conventions. When you write a text file and want to insert a line
* break, you need to use the correct line-ending character(s) for your
* operating system. Unix based systems use \n as the
* line ending character, Windows based systems use \r\n
* as the line ending characters and Macintosh based systems use
* \r as the line ending character.
* </p>
* <p>
* If you use the wrong line ending characters when writing your files, you
* might find that other applications that open those files will "look
* funny".
* </p>
* <p>
* Windows offers a text-mode translation flag ('t')
* which will transparently translate \n to
* \r\n when working with the file. In contrast, you
* can also use 'b' to force binary mode, which will not
* translate your data. To use these flags, specify either
* 'b' or 't' as the last character
* of the mode parameter.
* </p>
* <p>
* The default translation mode depends on the SAPI and version of PHP that
* you are using, so you are encouraged to always specify the appropriate
* flag for portability reasons. You should use the 't'
* mode if you are working with plain-text files and you use
* \n to delimit your line endings in your script, but
* expect your files to be readable with applications such as notepad. You
* should use the 'b' in all other cases.
* </p>
* <p>
* If you do not specify the 'b' flag when working with binary files, you
* may experience strange problems with your data, including broken image
* files and strange problems with \r\n characters.
* </p>
* <p>
* For portability, it is strongly recommended that you always
* use the 'b' flag when opening files with fopen.
* </p>
* <p>
* Again, for portability, it is also strongly recommended that
* you re-write code that uses or relies upon the 't'
* mode so that it uses the correct line endings and
* 'b' mode instead.
* </p>
* @param bool $use_include_path [optional] <p>
* The optional third use_include_path parameter
* can be set to '1' or true if you want to search for the file in the
* include_path, too.
* </p>
* @param resource $context [optional] ¬e.context-support;
* @return resource|false a file pointer resource on success, or false on error.
*/
function fopen ($filename, $mode, $use_include_path = false, $context = null) {}
移动、拷贝和删除文件
rename 重命名一个文件或目录
rename(string $oldname, string $newname, resource $context = ?): bool
尝试把 oldname 重命名为 newname,必要时会在不同目录间移动。 如果重命名文件时 newname 已经存在,将会覆盖掉它。 如果重命名文件夹时 newname 已经存在,本函数将导致一个警告。
copy 拷贝文件
copy(string $source, string $dest, resource $context = ?): bool
将文件从 source 拷贝到 dest。 如果要移动文件的话,请使用 rename() 函数。
unlink 删除文件
unlink(string $filename, resource $context = ?): bool
删除 filename。和 Unix C 的 unlink() 函数相似。 发生错误时会产生一个 E_WARNING 级别的错误。
检测文件属性函数
bool file_exists ( $指定文件名或者文件路径) 功能:文件是否存在。
bool is_readable ( $指定文件名或者文件路径) 功能:文件是否可读
bool is_writeable ( $指定文件名或者文件路径) 功能:文件是否可写
bool is_executable ( $指定文件名或者文件路径) 功能:文件是否可执行
bool is_file ( $指定文件名或者文件路径) 功能:是否是文件
bool is_dir ( $指定文件名或者文件路径) 功能:是否是目录
void clearstatcache ( void ) 功能:清楚文件的状态缓存
filesize 检测文件的大小
filectime 文件创建时间
filemtime 文件修改时间
fileatime 文件上次访问时间
file 把整个文件读入一个数组中
fgets 从文件指针中读取一行,读到最后返回false
fgetc 从文件指针中读取一个字符,读到最后返回false
ftruncate 将文件截断到给定的长度
文件常用函数和常量
DIRECTORY_SEPARATOR // 代表反斜杠
文件指针操作函数
rewind ( resource handle)
功能:指针回到开始处
fseek ( resource handle, int offset [, int from_where])
功能:文件指针向后移动指定字符
文件锁处机制
文件锁的用途:
若一个人在写入一个文件,另外一个人同时也打个了这个文件进行写入文件。 这情况下,如果遇到一定的碰撞概率的话,不知道到底谁的操作为准。 因此,这个时候我们引入锁机制。若用户A在写入或者读取这个文件的时候,将文件加上共享锁。我可以读,其他人也可以读。 但是,我如果使用独占锁,这个文件归我了,你们都别动,除非我将文件锁进行释放。
注意:加上了文件锁后要注意释放。
bool flock ( resource $handleFile , int $operation)
锁类型:
锁类型 | 说明 |
---|---|
LOCK_SH | 取得共享锁定(读取的程序) |
LOCK_EX | 取得独占锁定(写入的程序) |
LOCK_UN | 释放锁定(无论共享或独占) |
$fp = fopen("demo2.txt", "r+");
// 进行排它型锁定
if (flock($fp, LOCK_EX)) {
echo '1';
fwrite($fp, "文件这个时候被我独占了哟\n");
// 释放锁定
flock($fp, LOCK_UN);
} else {
echo "锁失败,可能有人在操作,这个时候不能将文件上锁";
}
fclose($fp);
模式部分
chgrp — 改变文件所属的组
chmod — 改变文件模式
chown — 改变文件的所有者
filegroup — 取得文件的组
fileowner — 取得文件的所有者
fileperms — 取得文件的权限
is_writable — 判断给定的文件名是否可写
is_writeable — is_writable 的别名
参考资料
PHP 手册 函数参考 文件系统相关扩展 文件系统 https://www.php.net/manual/zh/book.filesystem.php
php 创建和修改文件内容 https://www.php.cn/php-weizijiaocheng-396243.html
PHP 文件创建/写入 w3school https://www.w3school.com.cn/php/php_file_create.asp
PHP 文件处理 runoob https://www.runoob.com/php/php-file.html