ThinkPHP类库-File(文件操作类)
2026-04-17 06:46:38
171
分类:php
php中自带了很多文件操作的函数,但是毕竟琐碎,特别是对文件夹的操作。于是写了个对文件操作的类。
File类可以任意新建、移动、复制、覆盖、删除文件夹和文件;以及写入、追加文本;获取文件名,路径等。
<?php
// +----------------------------------------------------------------------
// | Author: 栉风沐雨 <188150920@qq.com>
// +----------------------------------------------------------------------
// | File.class.php 创建时间:2016-11-23
// | 最后修改时间:2017-10-19
// +----------------------------------------------------------------------
namespace Think;
/**
* 文件操作类
* 注:
* 相对路径为'./',绝对路径APP_ROOT(跟目录)
* 文件夹路径后不要加'/'
*/
class File
{
/**
* 获取文件后缀
* @param string $fileName 文件路径或者文件名
* @return string 文件后缀
*/
public function getFileSuffix($fileName)
{
return substr(strrchr($fileName, '.'), 1);
}
/**
* 获取文件名
* @param string $filePath 文件路径
* @return string
*/
public function getFileName($filePath)
{
return basename($filePath);
}
/**
* 获取文件名(basename不能有中文,所以用正则匹配)
* @param string $filePath 文件路径
* @return string
*/
public function getFileNameCn($filePath)
{
$filePath = preg_replace('/^.+[\\\\\\/]/', '', $filePath);
$count = strlen($this->getFileSuffix($filePath)) + 1;
return substr($filePath, 0, -$count);
}
/**
* 获取文件所处路径
*/
public function getFilePath($filePath)
{
return str_replace(basename($filePath), '', $filePath);
}
/**
* 去掉地址栏参数
*/
public function clearUrlQuery($url)
{
$exp = explode('?', $url);
return $exp[0];
}
/**
* 建立文件夹
* @param string $aimUrl 新建文件夹路径
* @param boolean $recursive 递归
* @return boolean
*/
public function createFolder($aimUrl, $recursive = true)
{
if (!is_dir($aimUrl)) {
return mkdir($aimUrl, 0777, $recursive);//可以用chmod('文件地址', 0777)改变文件权限
}
else {
return true;
}
}
/**
* 复制/移动文件夹
* @param string $oldDir 原路径
* @param string $aimDir 目标路径
* @param boolean $overWrite 是否覆盖原文件
* @param boolean $remove 删除原文件(默认不删除)
* @return boolean
*/
private function transformFolder($oldDir, $aimDir, $overWrite = true, $remove = false)
{
if (!is_dir($oldDir)) {
return false;
}
if (!is_dir($aimDir)) {
$this->createFolder($aimDir);
}
$dirHandle = opendir($oldDir);
while (false !== ($file = readdir($dirHandle))) {
if ($file == '.' || $file == '..') {
continue;
}
$old = $oldDir . '/' . $file;
$aim = $aimDir . '/' . $file;
if (!is_dir($old)) {
$this->copyFile($old, $aim, $overWrite);
}
else {
$this->copyFolder($old, $aim, $overWrite);
}
}
closedir($dirHandle);
if ($remove) {
return $this->deleteFolder($oldDir);
}
return true;
}
/**
* 复制文件夹
* @param string $oldDir 原路径
* @param string $aimDir 目标路径
* @param boolean $overWrite 是否覆盖原文件
* @return boolean
*/
public function copyFolder($oldDir, $aimDir, $overWrite = true)
{
return $this->transformFolder($oldDir, $aimDir, $overWrite, false);
}
/**
* 移动文件夹
* @param string $oldDir 原路径
* @param string $aimDir 目标路径
* @param boolean $overWrite 是否覆盖原文件
* @return boolean
*/
public function moveFolder($oldDir, $aimDir, $overWrite = true)
{
return $this->transformFolder($oldDir, $aimDir, $overWrite, true);
}
/**
* 复制/移动文件
* @param string $fileUrl 原文件路径
* @param string $aimUrl 目标路径
* @param boolean $overWrite 该参数控制是否覆盖原文件
* @param boolean $remove 删除原文件(默认不删除)
* @return boolean
*/
private function transformFile($fileUrl, $aimUrl, $overWrite = true, $remove = false)
{
//原文件不存在
if (!file_exists($fileUrl)) {
return false;
}
//目标文件是否存在并覆盖
if (file_exists($aimUrl)) {
if ($overWrite) {
$this->deleteFile($aimUrl);
}
else {
return false;
}
}
else {
$aimFolder = dirname($aimUrl);
if (!is_dir($aimFolder)) {
$this->createFolder($aimFolder);
}
}
if ($remove) {
return rename($fileUrl, $aimUrl);
}
else {
return copy($fileUrl, $aimUrl);
}
}
/**
* 复制文件
* @param string $fileUrl 原路径
* @param string $aimUrl 目标路径
* @param boolean $overWrite 是否覆盖原文件
* @return boolean
*/
public function copyFile($fileUrl, $aimUrl, $overWrite = true)
{
return $this->transformFile($fileUrl, $aimUrl, $overWrite, false);
}
/**
* 移动文件
* @param string $fileUrl 原路径
* @param string $aimUrl 目标路径
* @param boolean $overWrite 是否覆盖原文件
* @return boolean
*/
public function moveFile($fileUrl, $aimUrl, $overWrite = true)
{
return $this->transformFile($fileUrl, $aimUrl, $overWrite, true);
}
/**
* 删除文件
* @param string $fileUrl 要删除的文件路径
* @return boolean
*/
public function deleteFile($fileUrl)
{
if (!file_exists($fileUrl)) {
return false;
}
else {
return unlink($fileUrl);
}
}
/**
* 删除文件夹
* @param string $aimDir 要删除的文件夹路径
* @param boolean $deleteDir 是否保留外层文件夹
* @return boolean
*/
public function deleteFolder($aimDir, $deleteDir = true)
{
if (!is_dir($aimDir)) {
return false;
}
$dirHandle = opendir($aimDir);
while (false !== ($file = readdir($dirHandle))) {
if ($file == '.' || $file == '..') {
continue;
}
$aim = $aimDir . '/' . $file;
//判断是文件还是文件夹
if (!is_dir($aim)) {
$this->deleteFile($aim);
}
else {
$this->deleteFolder($aim);
}
}
closedir($dirHandle);
if ($deleteDir) {
return rmdir($aimDir);
}
else {
return true;
}
}
/**
* 清空文件夹
* @param string $aimDir 要清空的文件夹路径
* @return boolean
*/
public function clearFolder($aimDir)
{
return $this->deleteFolder($aimDir, false);
}
/**
* 读取文本内容
* @param mixed $fileName 文件路径
* @return mixed
*/
public function readFile($fileName)
{
return file_get_contents($fileName);
}
/**
* 写入文本内容(文件不存在则自动创建)
* @param string $fileName 文件路径
* @param string $text 写入文本
*/
public function writeFile($fileName, $text)
{
file_put_contents($fileName, $text);
}
/**
* 追加文本内容(文件不存在则自动创建)
* @param mixed $fileName 文件路径
* @param mixed $text 写入文本
* @param mixed $newline 换行
*/
public function appendFile($fileName, $text, $newline = true)
{
if ($newline) {
$text .= PHP_EOL;
}
file_put_contents($fileName, $text, FILE_APPEND | LOCK_EX);//写文件的时候先锁定,防止多人同时写入造成内容丢失
}
}