学习目标

  1. PHP操作目录
  2. PHP操作文件

文件与路径操作

创建新目录mkdir()

描述:尝试新建一个由 pathname 指定的目录。

语法:

bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false ]] )

参数:

  • $pathname:指定目录的路径;
  • $mode:默认的 mode 是 0777,意味着最大可能的访问权。$mode在windows下被忽略。 注意$mode的值为八进制。
  • $recursive:如果指定的路径的上级目录不存在,则也会递归创建。
  • 返回值:成功时返回TRUE,失败时返回FALSE。
<?php

$filePath = "./dmeo/a/b/c";

$result = mkdir($filePath, 0, true);

if ($result) {
    echo "创建目录成功!";
} else {
    echo "创建目录失败!";
}

判断是否是一个目录is_dir()

描述:判断给定文件名是否是一个目录。

语法:

bool is_dir ( string $filename )

返回值:如果文件名存在,并且是个目录,返回 TRUE,否则返回FALSE。

<?php


$filePath = "./demo2/a.txt";

// 判断的文件和目录不一定是当前文件夹里面有的,该函数就是根据后缀名来判断的,有后缀就是文件,无就是路径
if (is_dir($filePath)) {
    echo "{$filePath}是个文件目录";
} else {
    echo "{$filePath}是个文件";
}

判断目录或文件是否存在file_exists()

语法:

bool file_exists ( string $filename )

提示:可以判断文件,也可以判断目录,是否存在。

返回:如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE。

<?php

$filePath ="./demo/demo.dat";

if (!file_exists($filePath)) {
    echo "路径{$filePath}不存在,请检查路径!";
    die();
}

if (is_dir($filePath)) {
    echo "路径{$filePath}不是文件路径!";
    die();
}

echo "{$filePath}存在.";

?>

删除目录rmdir()

语法:

bool rmdir ( string $dirname )

参数:$dirname目录路径。

返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。

提示:尝试删除 dirname 所指定的目录。 该目录必须是空的,且要有相应的权限。

<?php

$filePath = "./dmeo/a/b/c";

$result = mkdir($filePath, 0, true);

if ($result) {
    echo "创建目录成功!";
} else {
    echo "创建目录失败!";
}

更改目录的访问权限chmod()

描述:改变文件的访问权限

语法:

bool chmod ( string $filename , int $mode )

参数:

  • $filename,指定文件的路径;
  • $mode,mode 参数包含三个八进制数按顺序分别指定了所有者、所有者所在的组以及所有人的访问限制。每一部分都可以通过加入所需的权限来计算出所要的权限。数字 1 表示使文件可执行,数字 2 表示使文件可写,数字 4 表示使文件可读。加入这些数字来制定所需要的权限。

提示:在window下文件的只读权限是 0444。文件夹只读权限0555。

注意:此函数不能作用于远程文件

取得目录或文件访问权限fileperms()

语法:

int fileperms ( string $filename )

返回值:以十进制数字返回文件的访问权限。

<?php

$filePath ="./demo/demo.dat";

if (!file_exists($filePath)) {
    echo "路径{$filePath}不存在,请检查路径!";
    die();
}

if (is_dir($filePath)) {
    echo "路径{$filePath}不是文件路径!";
    die();
}

$filePermsNumPre = fileperms($filePath); // 得到文件权限十进制值
$filePermsNumMib = decoct($filePermsNumPre); // 将十进制权限转为八进制
$filePermsNum = substr($filePermsNumMib, -4); //保留后四位

echo "文件{$filePath}的权限为:{$filePermsNum}";

重命名或移动文件或目录rename()

描述:重命名或移动一个文件或目录。如果文件不存在同一目录下,就是移动。

语法:

bool rename ( string $oldname , string $newname )

返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。

<?php

$oldName = "./demo/demo.dat";
$newName = "./demo/test.dat";

if (rename($oldName, $newName)) {
    echo "重命名成功!";
} else {
    echo "重命名失败!";
}

打开目录opendir()

描述:打开目录句柄,可用于之后的 closedir(),readdir() 和 rewinddir() 调用中。

语法:

resource opendir ( string $path )

返回值:如果成功则返回目录句柄的 resource,失败则返回 FALSE。

<?php

$filePath ="./demo";

if (!file_exists($filePath)) {
    echo "路径{$filePath}不存在,请检查路径!<br>";
    die();
}

if (is_dir($filePath)) {
    echo "{$filePath}是文件夹!<br>";
} else {
    echo "{$filePath}是文件!<br>";
}

$resource = opendir($filePath); // 打开文件夹,返回资源型数据

while ($doc = readdir($resource)) {
    echo "{$doc}<br>";
}

读取目录中条目readdir()

描述:从目录句柄中读取条目 ;

语法:

string readdir ([ resource $dir_handle ] )

说明:返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回。

返回:成功则返回文件名 或者在失败时返回 FALSE 。

显示中文目录或文件iconv()

描述:字符串按要求的字符编码来转换

语法:

string iconv ( string $in_charset , string $out_charset , string $str )

参数:

  • $in_charset,输入的字符集;
  • $out_charset,输出的字符集;
  • $str,要转换的字符串;

返回:返回转换后的字符串, 或者在失败时返回 FALSE。

关闭目录句柄closedir()

描述:关闭由 dir_handle 指定的目录流。流必须之前被 opendir() 所打开。

语法:

void closedir ( [resource $dir_handle] )

提示:如果省略$dir_handle,则默认为最后由opendir()打开的目录句柄。

文件读写操作

打开文件fopen()

描述:打开文件或者 URL

语法:

resource fopen ( string $filename , string $mode )

参数:$filename,指定要打开的目标文件或URL;​$mode,指定文件的打开方式。

提示:为移植性考虑,在用 fopen()打开文件时总是使用 'b' 标记。binary

返回值:成功时返回文件指针资源,如果打开失败,本函数返回 FALSE。

打开文件的方式:

mode说明
'r'只读方式打开,将文件指针指向文件头。
'r+'读写方式打开,将文件指针指向文件头。
'w'写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'w+'读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'a'写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'a+'读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'x'创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 *O_EXCL\O_CREAT* 标记是等价的。
'x+'创建并以读写方式打开,其他的行为和 'x' 一样。
'c'Open the file for writing only. If the file does not exist, it is created. If it exists, it is neither truncated (as opposed to 'w'), nor the call to this function fails (as is the case with 'x'). The file pointer is positioned on the beginning of the file. This may be useful if it's desired to get an advisory lock (see flock()) before attempting to modify the file, as using 'w' could truncate the file before the lock was obtained (if truncation is desired, ftruncate() can be used after the lock is requested).
'c+'Open the file for reading and writing; otherwise it has the same behavior as 'c'.

关闭文件fclose()

描述:关闭一个已打开的文件指针

语法:

bool fclose ( resource $handle )

参数:$handle必须是由fopen()打开的文件指针。

读取指定大小文件内容fread()

描述:读取文件(可安全用于二进制文件)

语法:

string fread ( resource $handle , int $length )

参数:$handle是由fopen()创建的handle;$length最多读取的字节数。

提示:在区分二进制文件和文本文件的系统上(如 Windows)打开文件时,fopen() 函数的 mode 参数要加上 ‘b’。

返回值:返回所读取的字符串, 或者在失败时返回 FALSE。

读取一行内容fgets()

描述:从文件指针中读取一行

语法:

string fgets ( resource $handle [, int $length ] )

参数:

  • $handle:文件指针必须是有效的
  • $length:从 handle指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。

返回值:从指针 handle 指向的文件中读取了 length - 1 字节后返回字符串。 如果文件指针中没有更多的数据了则返回 FALSE。

读取文件内容到数组中file()

描述:把整个文件读入一个数组中

语法:

array file ( string $filename [, int $flags = 0 ] )

参数:

  • $filename,文件的路径;
  • $flags,附加选项:

    • FILE_USE_INCLUDE_PATH(1):在include_path 中查找文件;
    • FILE_IGNORE_NEW_LINES(2):在数组的每个元素末尾不添加换行符;
    • FILE_SKIP_EMPTY_LINES(4):跳过空行。

注意:不需要打开文件和关闭文件。

读取文件内容到字符串中file_get_contents()

描述:将整个文件读入一个字符串 ,不用打开文件,也不用关闭文件

语法:

string file_get_contents ( string $filename )

返回:返回读取的数据,或在失败时返回false。

写入文件

描述:写入文件(可安全用于二进制文件)

语法:

int fwrite ( resource $handle , string $string )

返回:返回写入的字符数,出现错误时则返回 FALSE 。

将一个字符串写入文件

描述:和依次调用 fopen(),fwrite()以及 fclose() 功能一样。

语法:

int file_put_contents ( string $filename , mixed $data [, int $flags = 0] )

参数:

  • $filename要被写入数据的文件名。
  • $data要写入的数据。类型可以是 string,array(一维数组)。
  • $flags附加选项。

    • FILE_USE_INCLUDE_PATH(1) 在 include 目录里搜索 filename
    • FILE_APPEND(8)如果文件 filename已经存在,追加数据而不是覆盖
    • LOCK_EX(2)在写入时获得一个独占锁。

提示:如果文件不存在,则会自动创建。如果文件过大,不能一次性处理

返回:该函数将返回写入到文件内数据的字节数,失败时返回FALSE。

拷贝文件

描述:将文件从 source 拷贝到 dest。

语法:

bool copy ( string $source , string $dest )

提示:如果目标文件存在,则会覆盖。

删除文件

语法:

bool unlink ( string $filename )

返回:成功时返回 TRUE, 或者在失败时返回 FALSE。

提示:可以删除虚拟空间之外的文件,但必须使用相对路径(../),但必须有权限。

注意:删除的文件不会进入回收站

其它的文件操作函数

  1. filesize(),可以获取文件大小,单位为字节。
  2. is_writable(),判断文件是否可写。
  3. is_readable(),判断文件是否可读。
  4. feof(),判断文件指针是否到达文件结尾。
  5. filectime(),获取创建文件的时间。
  6. fileatime(),获取文件最新访问时间。
  7. filemtime(),获取文件最后修改时间。