文件系统函数

参见

有关相关函数,另请参见 目录程序执行 部分。

有关可用作远程文件的各种 URL 封装器的列表和说明,另请参见 支持的协议和封装器

目录

  • basename — 返回路径的尾随名称组件
  • chgrp — 更改文件组
  • chmod — 更改文件模式
  • chown — 更改文件所有者
  • clearstatcache — 清除文件状态缓存
  • copy — 复制文件
  • delete — 参见 unlink 或 unset
  • dirname — 返回父目录的路径
  • disk_free_space — 返回文件系统或磁盘分区上的可用空间
  • disk_total_space — 返回文件系统或磁盘分区的总大小
  • diskfreespace — disk_free_space 的别名
  • fclose — 关闭打开的文件指针
  • fdatasync — 将数据(但不包括元数据)同步到文件
  • feof — 测试文件指针上的文件结尾
  • fflush — 将输出刷新到文件
  • fgetc — 从文件指针获取字符
  • fgetcsv — 从文件指针获取行并解析为 CSV 字段
  • fgets — 从文件指针获取行
  • fgetss — 从文件指针获取行并去除 HTML 标签
  • file — 将整个文件读入数组
  • file_exists — 检查文件或目录是否存在
  • file_get_contents — 将整个文件读入字符串
  • file_put_contents — 将数据写入文件
  • fileatime — 获取文件的最后访问时间
  • filectime — 获取文件的 inode 更改时间
  • filegroup — 获取文件组
  • fileinode — 获取文件 inode
  • filemtime — 获取文件修改时间
  • fileowner — 获取文件所有者
  • fileperms — 获取文件权限
  • filesize — 获取文件大小
  • filetype — 获取文件类型
  • flock — 可移植的咨询文件锁定
  • fnmatch — 将文件名与模式匹配
  • fopen — 打开文件或 URL
  • fpassthru — 输出文件指针上的所有剩余数据
  • fputcsv — 将行格式化为 CSV 并写入文件指针
  • fputs — fwrite 的别名
  • fread — 二进制安全文件读取
  • fscanf — 根据格式解析来自文件的输入
  • fseek — 在文件指针上查找
  • fstat — 使用打开的文件指针获取有关文件的信息
  • fsync — 将更改同步到文件(包括元数据)
  • 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 — 返回规范化的绝对路径名
  • realpath_cache_get — 获取 realpath 缓存项
  • realpath_cache_size — 获取 realpath 缓存大小
  • rename — 重命名文件或目录
  • rewind — 倒回文件指针的位置
  • rmdir — 删除目录
  • set_file_buffer — stream_set_write_buffer 的别名
  • stat — 提供有关文件的信息
  • symlink — 创建符号链接
  • tempnam — 使用唯一文件名创建文件
  • tmpfile — 创建临时文件
  • touch — 设置文件的访问和修改时间
  • umask — 更改当前 umask
  • unlink — 删除文件
添加笔记

用户贡献笔记 8 笔记

66
Christian
17 年前
我刚刚了解到,要以可移植的方式指定文件名,您不需要 'DIRECTORY_SEPARATOR' - 只需使用 '/' 即可。这让我真的很惊讶和震惊,因为到目前为止,我已经输入了大约一百万次 'DIRECTORY_SEPARATOR' 来保持平台独立 - 没有必要。不要犯同样的错误。
-3
tunnelareaten at gmail dot com
19 年前
我创建了这个函数来按扩展名搜索和/或显示文件,或在文件名中搜索字符串出现。任何评论或增强功能当然都是受欢迎的。我将很快更新此函数。

用法:list_files([字符串],[字符串],[int 1 | 0],[int 1 | 0]);

搜索扩展名:list_files([字符串],[字符串],[0],[int 1 | 0]);
返回数组:$myArray = list_files([字符串],[字符串],[0],[0]);
回显结果:list_files([字符串],[字符串],[0],[1]);

搜索字符串出现:list_files([字符串],[字符串],[1],[int 1 | 0]);
返回数组:$myArray = list_files([字符串],[字符串],[1],[0]);
回显结果:list_files([字符串],[字符串],[1],[1]);

<?php

function list_files($directory, $stringSearch, $searchHandler, $outputHandler) {
$errorHandler = false;
$result = array();
if (!
$directoryHandler = @opendir ($directory)) {
echo (
"<pre>\nerror: directory \"$directory\" doesn't exist!\n</pre>\n");
return
$errorHandler = true;
}
if (
$searchHandler === 0) {
while (
false !== ($fileName = @readdir ($directoryHandler))) {
if(@
substr ($fileName, - @strlen ($stringSearch)) === $stringSearch) {
@
array_push ($result, $fileName);
}
}
}
if (
$searchHandler === 1) {
while(
false !== ($fileName = @readdir ($directoryHandler))) {
if(@
substr_count ($fileName, $stringSearch) > 0) {
@
array_push ($result, $fileName);
}
}
}
if ((
$errorHandler === true) && (@count ($result) === 0)) {
echo (
"<pre>\nerror: no filetype \"$fileExtension\" found!\n</pre>\n");
}
else {
sort ($result);
if (
$outputHandler === 0) {
return
$result;
}
if (
$outputHandler === 1) {
echo (
"<pre>\n");
print_r ($result);
echo (
"</pre>\n");
}
}
}

?>
-3
Gregor Mosheh
20 年前
此函数搜索目录并返回所有文件名与指定正则表达式匹配的文件的数组。其概念与 Unix 的 find 程序类似。

function findfile($location='',$fileregex='') {
if (!$location or !is_dir($location) or !$fileregex) {
return false;
}

$matchedfiles = array();

$all = opendir($location);
while ($file = readdir($all)) {
if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".") {
$subdir_matches = findfile($location.'/'.$file,$fileregex);
$matchedfiles = array_merge($matchedfiles,$subdir_matches);
unset($file);
}
elseif (!is_dir($location.'/'.$file)) {
if (preg_match($fileregex,$file)) {
array_push($matchedfiles,$location.'/'.$file);
}
}
}
closedir($all);
unset($all);
return $matchedfiles;
}

$htmlfiles = findfile('/some/dir','/\.(htm|html)$/');
-7
mitra at mitra dot biz
21 年前
[email protected] 在回答有关设置这些变量的问题时做出了贡献。
此选项 *可以* 在您的 PHP 脚本中设置。
示例

<?php
ini_set
('auto_detect_line_endings', true);
$contents = file('unknowntype.txt');

ini_set('auto_detect_line_endings', false);
$content2 = file('unixfile.txt');
?>

请注意,在 PHP 4.3 中,无论何时使用 fgets 或 file 读取 Mac 文件,您都需要使用 auto_detect_line_endings,因为否则将假定使用 \n。但是,在 PHP 5.0 中,stream_get_line() 允许您指定要读取的换行符字符。

\\ 从 MAC 文件读取一行
stream_get_line($fp, 4096, "\r");

\\ 从 UNIX 文件读取一行
stream_get_line($fp, 4096, "\n");

\\ 从 DOS 文件读取一行
stream_get_line($fp, 4096, "\r\n");

\\ 读取任何文件系统换行符之前的行
ini_set('auto_detect_line_endings', true); fgets($fp);

\\ 您也可以创建自己的换行符字符
\\ 读取第一个 ":" 之前的部分
stream_get_line($fp, 4096, ":");
-11
drapeko.com
15 年前
您有一个目录数组(简单的目录列表)

<?php
$array
= array(
'/home/drapeko/var',
'/home/drapeko/var/y',
'/home/drapeko',
'/home',
'/var/libexec'
);
);
?>

您希望将此数组转换为目录层次结构

<?php
$array
= array (
'home' => array (
'drapeko' => array (
'var' => array (
'y' => array()
)
)
),
'var' => array(
'libexec' => array()
)
);
?>

您如何做到这一点?

首先,以下函数将帮助我们。

<?php
/**
* 此函数将实际文件系统路径转换为字符串数组表示形式。
*
* 例如,
* '/home/drapeko/var/y 将转换为 $result_array['home']['drapeko']['var']['y']
* '/home/drapeko/var/y/file.txt 将转换为 $result_array['home']['drapeko']['var']['y']
*
* @param $path 目录的实际路径
* @return string 路径的字符串数组表示形式
*/
function pathToArrayStr($path) {
// TODO 常量/配置?
$res_path = str_replace(array(':/', ':\\', '/', '\\', DIRECTORY_SEPARATOR), '/', $path);
// 如果第一个或最后一个符号是 '/',则删除它(例如,对于 Linux)
$res_path = preg_replace(array("/^\//", "/\/$/"), '', $res_path);
// 创建字符串
$res_path = '[\''.str_replace('/', '\'][\'', $res_path).'\']';

return
$res_path;
}
?>

它只是将文件的实际路径转换为数组字符串表示形式。

您如何使用此函数?我知道它看起来有点令人困惑。但它非常简单。请考虑以下示例

<?php
$result
= array();
$check = array();
foreach(
$array as $val) {
$str = pathToArrayStr($val, 'result');
foreach(
$check as $ck) {
if (
strpos($ck, $str) !== false) {
continue
2;
}
}
$check[] = $str;
eval(
'$result'.$str.' = array();');
}
print_r($result);
?>

嘿,您觉得怎么样?这种方法对我非常有帮助。希望您也能发现它有用。:)
-7
jdhurn at uberidx dot com
21 年前
这是一个我用来确定文件是否包含二进制信息的函数。我在我的搜索引擎中使用它,以便它不会尝试索引 .zip 或 .mp3 等不包含可读信息的任何其他文件。它使用字符类型扩展(如果已加载),如果未加载,则使用正则表达式。

function is_binary($link)
{
$tmpStr = '';
@$fp = fopen($link, 'rb');
@$tmpStr = fread($fp, 256);
@fclose($fp);

if($tmpStr != '')
{
$tmpStr = str_replace(chr(10), '', $tmpStr);
$tmpStr = str_replace(chr(13), '', $tmpStr);

$tmpInt = 0;

for($i =0; $i < strlen($tmpStr); $i++)
{
if( extension_loaded('ctype') )
{
if( !ctype_print($tmpStr[$i]) )
$tmpInt++;
}
else
{
if( !eregi("[[:print:]]+", $tmpStr[$i]) )
$tmpInt++;
}
}

if($tmpInt > 5)
return(0);
else
return(1);
}
else
return(0);
}
-11
ob at babcom dot biz
11 年前
一个基于“tunnelareaten at gmail dot com”的想法的函数,用于通过搜索字符串或文件扩展名在给定目录中搜索文件。

我添加了对递归搜索所有子目录的支持,并确定是否应返回文件路径。

<?php
// 递归函数,通过搜索词或文件扩展名获取给定文件夹的内容
// (不显示文件夹)
// 标准:文件夹名:字符串
// 搜索词:字符串
// 搜索类型:ext/search(文件扩展名或文件名中的搜索词)
// SaveCompletePath:true/1
// 用法:array FileSearch_r($Folder,$Search[,$SearchType,$SavePath])

function FileSearch_r($Dir,$Search,$SearchType="search",$SavePath=1) {
$Array=array();
$D=dir($Dir);
while (
false!==($Entry=$D->read()))
if (
$Entry!='.' && $Entry!='..') {
$Entry=$Dir.$Entry;
if (
is_dir($Entry)) $Array=array_merge($Array,FileSearch_r($Entry.'/',$Search,$SearchType,$SavePath));
else
if (
$SearchType=="search"
?substr_count($Entry,$Search)>0
:($SearchType=="ext"
?substr($Entry,-strlen($Search))===$Search
:true))
$Array[]=$Entry;
}
$D->close();
sort($Array,SORT_STRING);
if(!(bool)
$SavePath) $Array=str_replace($Dir,"",array_values($Array));
return
$Array;
}
?>
-9
regis at webstuff dot com dot br
21 年前
如果您在将原始字节写入文件时遇到问题,以下是一个有用的函数。

它接收一个整数并返回一个数组,该数组包含每个数组索引上的字节的 ASCII 值。

function int2bytes($number){
$byte = $number;
$i=0;
do{
$dec_tmp = $byte;

$byte = bcdiv($byte,256,0);
$resto = $dec_tmp - (256 * $byte);
$return[] = $resto;
} while($byte >= 256);
if($byte) $return[] = $byte;
return array_reverse($return);
}

示例

$arr = int2bytes(75832);

$arr 将包含以下值
数组
(
[0] => 1
[1] => 40
[2] => 56
)

现在,要将此数据写入文件,只需使用带 chr() 的 fputs(),就像这样

fputs($fp,chr($arr[0]).chr($arr[1]).chr($arr[2]))

-- Regis
To Top