PHP_011 文件和目录

文件包含

include 和 require 语句

在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。

include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。

include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:

  • require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。

  • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。

因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。

包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。

语法

include 'filename';

或者

require 'filename';

实例1

假设您有一个标准的页头文件,名为 "header.php"。如需在页面中引用这个页头文件,请使用 include/require:

<html>
<body>
<?php include 'header.php'; ?>
<h1>Welcome to my home page!</h1>
<p>Some text.</p>
</body>
</html>

实例 2

假设我们有一个在所有页面中使用的标准菜单文件。

"menu.php":

echo '<a href="/default.php">Home</a>
<a href="/tutorials.php">Tutorials</a>
<a href="/references.php">References</a>
<a href="/examples.php">Examples</a> 
<a href="/about.php">About Us</a> 
<a href="/contact.php">Contact Us</a>';

网站中的所有页面均应引用该菜单文件。以下是具体的做法:

<html>
<body>
<div class="leftmenu">
<?php include 'menu.php'; ?>
</div>
<h1>Welcome to my home page.</h1>
<p>Some text.</p>
</body>
</html>

实例 3

假设我们有一个定义变量的包含文件("vars.php"):

<?php
$color='red';
$car='BMW';
?>

这些变量可用在调用文件中:

<html>
<body>
<h1>Welcome to my home page.</h1>
<?php include 'vars.php';
echo "I have a $color $car"; // I have a red BMW
?>
</body>
</html>

打开文件

fopen() 函数用于在 PHP 中打开文件。

此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:

<html>
<body>
<?php

$file=fopen("welcome.txt","r");

?>
</body>
</html>

文件可能通过下列模式来打开:

模式描述
r只读。在文件的开头开始。
r+读/写。在文件的开头开始。
w只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
w+读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。
a追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。
a+读/追加。通过向文件末尾写内容,来保持文件内容。
x只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
x+读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。

注释:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。

实例

如果 fopen() 函数不能打开指定的文件,下面的实例会生成一段消息:

<html>
<body>
<?php

$file=fopen("welcome.txt","r") or exit("Unable to open file!");

?>
</body>
</html>

关闭文件

fclose() 函数用于关闭打开的文件:

<?php

$file = fopen("test.txt","r");
//some code to be executed

fclose($file);
?>

检测 End-of-file

feof() 函数检测是否已到达文件末尾(EOF)。

在循环遍历未知长度的数据时,feof() 函数很有用。

注释:在 w 、a 和 x 模式下,您无法读取打开的文件!

if (feof($file)) echo "End of file";

逐行读取文件

fgets() 函数用于从文件中逐行读取文件。

注释:在调用该函数之后,文件指针会移动到下一行。

实例

下面的实例逐行读取文件,直到文件末尾为止:

<?php

   
$file = fopen("welcome.txt", "r") or exit("Unable to open file!");   


//Output a line of the file until the end is reached

   

while(!feof($file))
{

echo fgets($file). "<br>";

}
fclose($file);
?>

逐字符读取文件

fgetc() 函数用于从文件中逐字符地读取文件。

注释:在调用该函数之后,文件指针会移动到下一个字符。

实例

下面的实例逐字符地读取文件,直到文件末尾为止:

<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
while (!feof($file))
{

echo fgetc($file);

}
fclose($file);
?>

文件上传表单

允许用户从表单上传文件是非常有用的。

请看下面这个供上传文件的 HTML 表单:

<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>

有关上面的 HTML 表单的一些注意项列举如下:

  • <form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。

  • <input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。

注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。

上传脚本

"upload_file.php" 文件含有供上传文件的代码:

<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{

echo "Upload: " . $_FILES["file"]["name"] . "<br>";

echo "Type: " . $_FILES["file"]["type"] . "<br>";

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";

echo "Stored in: " . $_FILES["file"]["tmp_name"];

}
?>

通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。

第一个参数是表单的 input name,第二个下标可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:

  • $_FILES["file"]["name"] - 被上传文件的名称

  • $_FILES["file"]["type"] - 被上传文件的类型

  • $_FILES["file"]["size"] - 被上传文件的大小,以字节计

  • $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称

  • $_FILES["file"]["error"] - 由文件上传导致的错误代码

这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。

上传限制

在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 和 .jpeg 文件,文件大小必须小于 20 kB:

<?php

$allowedExts = array("gif", "jpeg", "jpg", "png");

$temp = explode(".", $_FILES["file"]["name"]);

$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/gif")

|| ($_FILES["file"]["type"] == "image/jpeg")

|| ($_FILES["file"]["type"] == "image/jpg")

|| ($_FILES["file"]["type"] == "image/pjpeg")

|| ($_FILES["file"]["type"] == "image/x-png")

|| ($_FILES["file"]["type"] == "image/png"))

&& ($_FILES["file"]["size"] < 20000)

&& in_array($extension, $allowedExts))

{

if ($_FILES["file"]["error"] > 0)

{

echo "Error: " . $_FILES["file"]["error"] . "<br>";

}

else

{

echo "Upload: " . $_FILES["file"]["name"] . "<br>";

echo "Type: " . $_FILES["file"]["type"] . "<br>";

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";

echo "Stored in: " . $_FILES["file"]["tmp_name"];

}

}

else

{

echo "Invalid file";

}

?>

保存上传的文件

上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。

这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:

<?php

$allowedExts = array("gif", "jpeg", "jpg", "png");

$temp = explode(".", $_FILES["file"]["name"]);

$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/gif")

|| ($_FILES["file"]["type"] == "image/jpeg")

|| ($_FILES["file"]["type"] == "image/jpg")

|| ($_FILES["file"]["type"] == "image/pjpeg")

|| ($_FILES["file"]["type"] == "image/x-png")

|| ($_FILES["file"]["type"] == "image/png"))

&& ($_FILES["file"]["size"] < 20000)

&& in_array($extension, $allowedExts))

{

if ($_FILES["file"]["error"] > 0)

{

echo "Return Code: " . $_FILES["file"]["error"] . "<br>";

}

else

{

echo "Upload: " . $_FILES["file"]["name"] . "<br>";

echo "Type: " . $_FILES["file"]["type"] . "<br>";

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";

echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";


if (file_exists("upload/" . $_FILES["file"]["name"]))

{

echo $_FILES["file"]["name"] . " already exists. ";

}

else

{

move_uploaded_file($_FILES["file"]["tmp_name"],

"upload/" . $_FILES["file"]["name"]);

echo "Stored in: " . "upload/" . $_FILES["file"]["name"];

}

}

}

else

{

echo "Invalid file";

}

?>

上面的脚本检测了文件是否已存在,如果不存在,则把文件拷贝到名为 "upload" 的文件夹。


Filesystem函数

Runtime 配置

Filesystem 函数的行为受到 php.ini 中设置的影响。

Filesystem 配置选项:

名称默认描述可改变
allow_url_fopen"1"允许 fopen()-type 函数使用 URL。(PHP 4.0.4 版以后可用)PHP_INI_SYSTEM
user_agentNULL定义 PHP 发送的用户代理。(PHP 4.3 版以后可用)PHP_INI_ALL
default_socket_timeout"60"设置基于 socket 流的默认的超时时间(秒)。(PHP 4.3 版以后可用)PHP_INI_ALL
from""定义匿名 FTP 的密码(您的 email 地址)。PHP_INI_ALL
auto_detect_line_endings"0"当设置为 "1" 时,PHP 将检查通过 fgets() 和 file() 取得的数据中的行结束符号是符合 Unix、MS-Dos 还是 Mac 的习惯。(PHP 4.3 版以后可用)PHP_INI_ALL

PHP 5 Filesystem 函数

函数描述
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 和 PHP 标签。
file()把文件读入一个数组中。
file_exists()检查文件或目录是否存在。
file_get_contents()把文件读入字符串。
file_put_contents()把字符串写入文件。
fileatime()返回文件的上次访问时间。
filectime()返回文件的上次修改时间。
filegroup()返回文件的组 ID。
fileinode()返回文件的 inode 编号。
filemtime()返回文件内容的上次修改时间。
fileowner()返回文件的用户 ID (所有者)。
fileperms()返回文件的权限。
filesize()返回文件大小。
filetype()返回文件类型。
flock()锁定或释放文件。
fnmatch()根据指定的模式来匹配文件名或字符串。
fopen()打开一个文件或 URL。
fpassthru()从打开的文件中读数据,直到文件末尾(EOF),并向输出缓冲写结果。
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() 打开的进程。
popen()打开一个进程。
readfile()读取一个文件,并写入到输出缓冲。
readlink()返回符号连接的目标。
realpath()返回绝对路径名。
realpath_cache_get()返回高速缓存条目。
realpath_cache_size()返回高速缓存大小。
rename()重命名文件或目录。
rewind()倒回文件指针的位置。
rmdir()删除空的目录。
set_file_buffer()设置已打开文件的缓冲大小。
stat()返回关于文件的信息。
symlink()创建符号连接。
tempnam()创建唯一的临时文件。
tmpfile()创建唯一的临时文件。
touch()设置文件的访问和修改时间。
umask()改变文件的文件权限。
unlink()删除文件。

Directory 函数

函数描述
chdir()改变当前的目录。
chroot()改变根目录。
closedir()关闭目录句柄。
dir()返回 Directory 类的实例。
getcwd()返回当前工作目录。
opendir()打开目录句柄。
readdir()返回目录句柄中的条目。
rewinddir()重置目录句柄。
scandir()返回指定目录中的文件和目录的数组。

 

转载于:https://my.oschina.net/u/2317401/blog/381644

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值