发布于:2021-06-10 09:04:28
/**
* 文件处理
* @author
*
*/
class File
{
/**
* 判断 文件/目录 是否可写(取代系统自带的 is_writeable 函数)
*
* @param string $file 文件/目录
* @return boolean
*/
public function is_write($file)
{
if (is_dir($file)) {
$dir = $file;
if ($fp = @fopen("$dir/test.txt", 'w')) {
@fclose($fp);
@unlink("$dir/test.txt");
$writeable = true;
} else {
$writeable = false;
}
} else {
if ($fp = @fopen($file, 'a+')) {
@fclose($fp);
$writeable = true;
} else {
$writeable = false;
}
}
return $writeable;
}
/**
* 文件尺寸大小
* @param unknown $dir
* @return number
*/
public function get_dir_size($dir_path)
{
$size = 0;
if (is_dir($dir_path)) {
$handle = opendir($dir_path);
while (false !== ($entry = readdir($handle))) {
if ($entry != '.' && $entry != '..') {
if (is_dir("{$dir_path}/{$entry}")) {
$size += get_dir_size("{$dir_path}/{$entry}");
} else {
$size += filesize("{$dir_path}/{$entry}");
}
}
}
closedir($handle);
}
return $size;
}
/**
* 文件尺寸大小换算
* @param unknown $size
* @return string
*/
public function size_conversion($size_num)
{
switch ($size_num) {
case $size_num >= 1073741824:
$size_str = round($size_num / 1073741824 * 100) / 100 . ' GB';
break;
case $size_num >= 1048576:
$size_str = round($size_num / 1048576 * 100) / 100 . ' MB';
break;
case $size_num >= 1024:
$size_str = round($size_num / 1024 * 100) / 100 . ' KB';
break;
default:
$size_str = $size_num . ' Bytes';
break;
}
return $size_str;
}
/**
* 删除指定目录下的文件和文件夹
* @param unknown $dirpath
* @return boolean
*/
public function del_dir($dirpath)
{
$dh = opendir($dirpath);
while (($file = readdir($dh)) !== false) {
if ($file != "." && $file != "..") {
$fullpath = $dirpath . "/" . $file;
if (!is_dir($fullpath)) {
unlink($fullpath);
} else {
$this->del_dir($fullpath);
rmdir($fullpath);
}
}
}
closedir($dh);
$isEmpty = true;
$dh = opendir($dirpath);
while (($file = readdir($dh)) !== false) {
if ($file != "." && $file != "..") {
$isEmpty = false;
break;
}
}
return $isEmpty;
}
/**
* 文件强制下载
* @param unknown $dir
*/
public function dir_readfile($dir)
{
if (file_exists($dir)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($dir));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($dir));
ob_clean();
flush();
readfile($dir);
}
}
/**
* 压缩文件夹
* @param unknown $dir
* @param unknown $zipfile
*/
public function zip_dir($dir, $zipfile, $newdir = '')
{
$zip = new ZipArchive();
if ($zip->open($zipfile, ZipArchive::CREATE) === TRUE) {
add_file_toZip($dir, $zip, $newdir); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
$zip->close(); //关闭处理的zip文件
}
}
/**
* 读取文件单文件压缩 zipdir方法调用
* @param unknown $dir
* @param unknown $zip
*/
public function add_file_toZip($dir, $zip, $newdir = '')
{
$handler = opendir($dir); //打开当前文件夹由$dir指定
$filename = readdir($handler);
while (($filename = readdir($handler)) !== false) {
if ($filename != "." && $filename != "..") {//文件夹文件名字为'.'和‘..',不要对他们进行操作
if (is_dir($dir . '/' . $filename)) {// 如果读取的某个对象是文件夹,则递归
$this->add_file_toZip($dir . "/" . $filename, $zip, $newdir);
} else { //将文件加入zip对象
$new_dir_sep = substr($dir, strpos($dir, $newdir));
$zip->addFile($dir . "/" . $filename, $new_dir_sep . '/' . $filename);
}
}
}
@closedir($dir);
}
/**
* 将读取到的目录以数组的形式展现出来
* @return array
* opendir() 函数打开一个目录句柄,可由 closedir(),readdir() 和 rewinddir() 使用。
* is_dir() 函数检查指定的文件是否是目录。
* readdir() 函数返回由 opendir() 打开的目录句柄中的条目。
* @param array $files 所有的文件条目的存放数组
* @param string $file 返回的文件条目
* @param string $dir 文件的路径
* @param resource $handle 打开的文件目录句柄
*/
public function dir_scan($dir)
{
//定义一个数组
$files = array();
//检测是否存在文件
if (is_dir($dir)) {
//打开目录
if ($handle = opendir($dir)) {
//返回当前文件的条目
while (($file = readdir($handle)) !== false) {
//去除特殊目录
if ($file != "." && $file != "..") {
//判断子目录是否还存在子目录
if (is_dir($dir . "/" . $file)) {
//递归调用本函数,再次获取目录
$files[ $file ] = dir_scan($dir . "/" . $file);
} else {
//获取目录数组
$files[] = $file;
}
}
}
//关闭文件夹
closedir($handle);
//返回文件夹数组
return $files;
}
}
}
/**
* 创建文件夹
*
* @param string $path 文件夹路径
* @param int $mode 访问权限
* @param bool $recursive 是否递归创建
* @return bool
*/
public function dir_mkdir($path = '', $mode = 0777, $recursive = true)
{
clearstatcache();
if (!is_dir($path)) {
mkdir($path, $mode, $recursive);
return chmod($path, $mode);
}
return true;
}
/**
* 文件夹文件拷贝
*
* @param string $src 来源文件夹
* @param string $dst 目的地文件夹
* @return bool
*/
public function dir_copy($src = '', $dst = '')
{
if (empty($src) || empty($dst)) {
return false;
}
$dir = opendir($src);
$this->dir_mkdir($dst);
while (false !== ($file = readdir($dir))) {
if (($file != '.') && ($file != '..')) {
if (is_dir($src . '/' . $file)) {
$this->dir_copy($src . '/' . $file, $dst . '/' . $file);
} else {
copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
return true;
}
}
阅读 177+
10