我刚刚了解到,要以可移植的方式指定文件名,您不需要 'DIRECTORY_SEPARATOR' - 只需使用 '/' 即可。这让我真的很惊讶和震惊,因为到目前为止,我已经输入了大约一百万次 'DIRECTORY_SEPARATOR' 来保持平台独立 - 没有必要。不要犯同样的错误。
我刚刚了解到,要以可移植的方式指定文件名,您不需要 'DIRECTORY_SEPARATOR' - 只需使用 '/' 即可。这让我真的很惊讶和震惊,因为到目前为止,我已经输入了大约一百万次 'DIRECTORY_SEPARATOR' 来保持平台独立 - 没有必要。不要犯同样的错误。
我创建了这个函数来按扩展名搜索和/或显示文件,或在文件名中搜索字符串出现。任何评论或增强功能当然都是受欢迎的。我将很快更新此函数。
用法: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");
}
}
}
?>
此函数搜索目录并返回所有文件名与指定正则表达式匹配的文件的数组。其概念与 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)$/');
[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, ":");
您有一个目录数组(简单的目录列表)
<?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);
?>
嘿,您觉得怎么样?这种方法对我非常有帮助。希望您也能发现它有用。:)
这是一个我用来确定文件是否包含二进制信息的函数。我在我的搜索引擎中使用它,以便它不会尝试索引 .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);
}
一个基于“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;
}
?>
如果您在将原始字节写入文件时遇到问题,以下是一个有用的函数。
它接收一个整数并返回一个数组,该数组包含每个数组索引上的字节的 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