PHP 文件系统


PHP 文件系统


正文

常用示例

// 判断目录是否存在
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] &note.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


返回