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);//写文件的时候先锁定,防止多人同时写入造成内容丢失
    }
}