PHP文件和操作系统函数

获取路径的文件名 basename()

返回路径的文件名部分 ,参数1路径,参数2忽略指定后缀[可选]

$path = '/home/www/data/log.txt';
echo basename($path);
echo basename($path, '.txt');

输出: log.txt, log

获取路径的目录 dirname()

$path = '/home/www/data/log.txt';
echo dirname($path);

输出: /home/www/data

获取路径的更多信息 pathinfo()

输出关联数组,分别是 目录名,基本名,扩展名,文件名

$path = '/home/www/data/log.txt';
$info =  pathinfo($path);

输出:Array
(
[dirname] => /home/www/data
[basename] => log.txt
[extension] => txt
[filename] => log
)

计算文件、目录、磁盘大小

查看文件大小 filesize()

$path = 'data.csv';
$info =  filesize($path);
echo $info .' byte';
echo round($info/1024,2) . " kb";

输出: 2157 byte ,2.11 kb

查看磁盘可用空间 disk_free_space()

$info =  disk_free_space("c:/");
echo $info .'byte';
echo round($info/1024/1024,2) . "MB";

输出:49070256128 byte, 46797.04 MB

查看磁盘总容量 disk_total_space()

$info =  disk_total_space("c:/");
echo $info .'byte';
echo round($info/1024/1024,2) . "MB";

输出: 106542120960 byte,101606.48 MB

查看访问和修改时间

文件最后访问时间 fileatime()

文件最后改变时间 filectime()

文件最后修改时间 filemtime()

filectime 与 filemtime() 区别,filectime() 最后改变时间涉及到文件inode数据的任何改变,包括权限、所有者、组或其他信息,filemtime()文件内容最后修改时间

返回UNIX时间戳格式

$path = 'sales.csv';
echo date('m-d H:i', fileatime($path));
echo date('m-d H:i', filectime($path));
echo date('m-d H:i', filemtime($path));

输出: 06-09 09:54,06-03 15:01,06-03 15:03

文件处理

打开文件 fopen()

resource fopen(string resource, string mode)
指定模式,即确定该资源的访问级别,部分参数如下
r 只读,文件指针置于文件开头
r+ 读写,文件指针置于文件开头
a 只写,文件指针置于文件末尾,若文件不存在,即创建
a+ 读写,文件指针置于文件末尾,若文件不存在,即创建
fopen() 只负责建立句柄,实际读写操作,需要使用其他函数操作

$path = 'log.txt';
$fh = fopen($path, 'r');

输出: Resource id #3

关闭文件 fclose()

关闭资源

$fh = fopen($path, 'r');
fclose($fh);

读取文件

把文件读入数组 file()

读取txt 与 读取csv 都是一个元素存放一行

$fh = file("log.txt");
$fh = file("data.csv");

输出:
Array ( [0] => 399900 [1] => 399901 [2] => 399902 [3] => 399903 …)
Array ( [0] => Northeast,2019-06-03,2019-06-02,12.54 [1] => Northwest,2019-06-03,2019-05-03,563.9

把文件读入字符串变量 file_get_contents()

读取csv与txt文件,输出样式与文件一致,包括会输出换行符

$fh = file_get_contents("sales.csv");
$fh2 = file_get_contents("log.txt");

输出:
Northeast,2019-06-03,2019-06-02,12.54
Northwest,2019-06-03,2019-05-03,563.9
399901
399902

把csv读取数组 fgetcsv()

array fgetcsv(resource handle [, int length]) ,参数2读取length个字符后停止
示例一

$path2 = 'sales.csv';
$fh = file($path2);
foreach ($fh as $cnt){
    list($cnt1,$cnt2,$cnt3) = explode(',', $cnt);
    echo $cnt1, $cnt2, $cnt3, "<br>";
}

输出:
Northeast2019-06-032019-06-02
Northwest2019-06-032019-05-03

示例二
iconv() 函数 解决中文乱码问题
mb_convert_encoding() 转换字符编码

$handle = fopen( $_SERVER['DOCUMENT_ROOT'] .'/19-1.csv', 'r');
$ip = []; $mobile = [];
while($row = fgetcsv($handle, ','))
{
    $row[1] = iconv('gb2312','utf-8',$row[1]);
    $row[0] = iconv('gb2312','utf-8',$row[0]);
    //$row[0]  = mb_convert_encoding($row[0], 'gbk', 'utf-8')
    list($ip[],$mobile[]) = $row;
}
print_r($ip);
print_r($mobile);
fclose($handle);

输出: Array
(
[0] => IP定位
[1] => 甘肃省张掖市
[2] => 江苏省
[3] => 湖南省长沙市
[4] => 江苏省南通市
[5] => 四川省成都市
)
Array (
[0] => 电话
[1] => 15593386507
[2] => 13513168071
[3] => 13513168072
[4] => 13513168073
[5] => 13513168074
)

读取整个文件

读取整个文件,并立即输出到缓冲区,readfile立即输出,不需要打印,返回值是读取的字节数

readfile("log.txt");

输出:
399900
399901

将字符串写入文件 fwrite()

a+ 模式,拼接到文件末尾

$fh = fopen("log.txt", 'a+');
fwrite($fh, 'abcabc');
fclose($fh);

最后一行输出:
399946abcabc

将文件指针移到指定位置 fseek()

int fseek( resurce handle , int offset [ , int whence])
whence是可行参数,可设置3个参数, SEEK_CUR 设置指针为当前位置加上 offset 个字节,
SEEK_END设置指针为EOF加上 offset个字节,在这里,offset必须设置为负值。
SEEK_SET 设置指针位置为offset字节处,与忽略shence效果相同。

获取当前指针偏移量 ftell()

ftell() 获取资源中文件指针当前位置的偏移量,
int ftell( resource handle)

将文件指针移回到文件开始处 rewind()

int rewind( resource handle)

执行 shell 命令

删除目录 rmdir()

删除指定目录,成功返回TRUE, 否则 FALSE,用户必须对目录有写权限,此外目录必须为空
int rmdir( string dirname)

重命名文件 rename()

boolean rename(string oldname, string newname)

$dir = rename("log.txt", "log2.txt");

输出: 1

触摸文件 touch()

int touch(string filename [, int timne [, int atime]])
设置文件和最后修改时间和最后访问时间,成功返回1

$dir = touch("log2.txt", '2539095297');

输出:1

清理输入

使用passthru() 执行shell命令时,假如攻击者输入如下内容

http://www.wjgilmore.com/ ; cd /var/www/ ; rm -rf *

大多数UNIX shell 会将这个passthru() 请求解释为3个单独的命令,而后2个命令将导致整除整个web文档树。
防止这种尝试,有两个标准函数可以很方便地完成此工作

界定输入 escapeshellarg()

string escapeshellarg( string arguments)
escapeshellarg()函数用单引号界定给定的参数,并转义输入参数中的单引号

'http://www.wjgilmore.com/ ; cd /var/www/ ; rm -rf *'

shell命令会把单引号内的内容当作单个参数去执行,所以此命令将会返回一个错误(shell无法解析这种语法的URL)

** 转义可能危险的输入 escapeshellcmd() **

escapeshellcmd() 通过对 shell 原字符转义来清理可能存在的危险输入。
元字符包括

# & ; , | * ? ~ < > ^ ( ) [ ] { } $ \\ \x0A \xFF 

执行系统级命令 exec()

string exec( string command [, array &output [, int &return_var]])

exec ("languages.pl" , $results);
print_r($results);

输出:
Array (
[0] => perl
[1] => php
[2] => python
[3] => java
[4] => c
)

返回二进制输出 passthru()

与exec() 相似,只是它返回二进制输出
return_val 可选参数,即指定的变量,用于查看执行状态
void passthru( string command [ , int &return_var])

使用反引号执行 shell 命令 ``

shell_exec() 函数提供的语法形式与 反引号相同,会执行一个shell命令并返回输出
string shell_exec(string command)

echo `date`;
echo shell_exec('date');

输出:
Sun Mar 3 15:32:14 EDT 20xx
Sun Mar 3 15:32:14 EDT 20xx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值