You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
250 lines
6.2 KiB
250 lines
6.2 KiB
<?php
|
|
|
|
|
|
namespace file;
|
|
|
|
|
|
class FileSystem
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
private static $rootPath;
|
|
/**
|
|
* @var string
|
|
*/
|
|
private static $appPath;
|
|
/**
|
|
* @var string
|
|
*/
|
|
private static $runtimePath;
|
|
|
|
/**
|
|
* 获取文件名
|
|
* @param $file
|
|
* @return array
|
|
*/
|
|
public static function getFileName($file)
|
|
{
|
|
return explode('.', basename($file))[0];
|
|
}
|
|
|
|
/**
|
|
* 获取文件扩展名
|
|
* @param $file
|
|
* @return array
|
|
*/
|
|
public static function getFileExt($file)
|
|
{
|
|
return explode('.', basename($file))[1];
|
|
}
|
|
|
|
/**
|
|
* 获取应用根目录
|
|
* @return string
|
|
*/
|
|
public static function getRootPath()
|
|
{
|
|
if(!self::$rootPath) {
|
|
if ('cli' == PHP_SAPI) {
|
|
$scriptName = realpath($_SERVER['argv'][0]);
|
|
} else {
|
|
$scriptName = $_SERVER['SCRIPT_FILENAME'];
|
|
}
|
|
|
|
$path = realpath(dirname($scriptName));
|
|
if (!is_file($path . DIRECTORY_SEPARATOR . 'command')) {
|
|
$path = dirname($path);
|
|
}
|
|
self::$rootPath = $path . DIRECTORY_SEPARATOR;
|
|
}
|
|
return self::$rootPath;
|
|
}
|
|
|
|
/**
|
|
* 获取应用目录
|
|
* @return string
|
|
*/
|
|
public static function getAppPath()
|
|
{
|
|
if(!self::$appPath){
|
|
self::$appPath = self::getRootPath() . 'app' . DIRECTORY_SEPARATOR;
|
|
}
|
|
return self::$appPath;
|
|
}
|
|
|
|
/**
|
|
* 获取运行时目录
|
|
* @return string
|
|
*/
|
|
public static function getRuntimePath()
|
|
{
|
|
if(!self::$runtimePath){
|
|
self::$runtimePath = self::getRootPath() . 'runtime' . DIRECTORY_SEPARATOR;
|
|
}
|
|
return self::$runtimePath;
|
|
}
|
|
|
|
/**
|
|
* 搜索文件
|
|
* @param $path
|
|
* @param string $type
|
|
* @return array
|
|
*/
|
|
public static function scanFile($path, $type = null)
|
|
{
|
|
$result = array();
|
|
$files = scandir($path);
|
|
foreach ($files as $file) {
|
|
if ($file != '.' && $file != '..') {
|
|
if (is_dir($path . '/' . $file)) {
|
|
$result[$file] = self::scanFile($path . '/' . $file);
|
|
} elseif ($type && explode('.', $file)[1] == $type) {
|
|
$result[] = $path . '/' . $file;
|
|
} elseif (!$type){
|
|
$result[] = $path . '/' . $file;
|
|
}
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 保存文件
|
|
* @param $filename
|
|
* @param $data
|
|
* @return false|int
|
|
*/
|
|
public static function saveFile($filename, $data = '')
|
|
{
|
|
$dir = substr($filename,'0',strrpos($filename,'/'));
|
|
if (!file_exists($dir)) {
|
|
mkdir($dir, 777, true);
|
|
}
|
|
return file_put_contents($filename, json_encode($data));
|
|
}
|
|
|
|
/**
|
|
* 清空目录文件
|
|
* @param $dir
|
|
* @param null $type
|
|
*/
|
|
public static function clearDir($dir,$type = null){
|
|
$files = scandir($dir);
|
|
foreach ($files as $file) {
|
|
if ($file != '.' && $file != '..') {
|
|
if (is_dir($dir . '/' . $file)) {
|
|
self::clearDir($dir . '/' . $file);
|
|
@rmdir($dir . '/' . $file);
|
|
} else {
|
|
@unlink($dir . '/' . $file);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 读取文件某一行记录
|
|
* @param $file
|
|
* @param $line
|
|
* @return bool|false|string
|
|
*/
|
|
public static function getFileLine($file, $line)
|
|
{
|
|
$n = 0;
|
|
$handle = fopen($file, 'r');
|
|
if ($handle) {
|
|
while (!feof($handle)) {
|
|
++$n;
|
|
$out = fgets($handle, 4096);
|
|
if ($line == $n) break;
|
|
}
|
|
fclose($handle);
|
|
}
|
|
if ($line == $n) {
|
|
$encode = mb_detect_encoding($out, array("ASCII", 'UTF-8', "GB2312", "GBK", 'BIG5'));
|
|
$str = mb_convert_encoding($out, 'UTF-8', $encode);
|
|
return $str;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 文件追加写入
|
|
* @param $file
|
|
* @param $content
|
|
* @param bool $is_new_line
|
|
* @return false|int
|
|
*/
|
|
public static function appendWriteFile($file,$content,$is_new_line = true){
|
|
if($is_new_line){
|
|
$content .= PHP_EOL;
|
|
}
|
|
$handle = fopen($file, "a");
|
|
$ret = fwrite($handle, $content);
|
|
fclose($handle);
|
|
return $ret;
|
|
}
|
|
|
|
/**
|
|
* 获取文本文件行数
|
|
* @param $filename
|
|
* @param string $ending
|
|
* @return int
|
|
*/
|
|
public static function getTxtFileLines($filename, $ending = PHP_EOL)
|
|
{
|
|
$fp = fopen($filename, 'r');
|
|
$lines = 0;
|
|
while (stream_get_line($fp, filesize($filename),$ending)) {
|
|
$lines++;
|
|
}
|
|
fclose($fp);
|
|
return $lines;
|
|
}
|
|
|
|
/**
|
|
* 块级读取文件记录
|
|
* @param $file
|
|
* @param int $start
|
|
* @param int $end
|
|
* @param string $callback
|
|
* @return array
|
|
* @throws \Exception
|
|
*/
|
|
public static function getFileBlockData($file, $start = 0, $end = 0, $callback = '')
|
|
{
|
|
$n = 0;
|
|
$data = [];
|
|
$handle = fopen($file, 'r');
|
|
if (!$handle) {
|
|
throw new \Exception('文件'.$file.'不存在');
|
|
}
|
|
$start = $start >=0 ? $start: 0;
|
|
if($end !=0 && $start > $end){
|
|
$temp = $start;
|
|
$start = $end;
|
|
$end = $start;
|
|
}
|
|
while (!feof($handle)) {
|
|
++$n;
|
|
$str = fgets($handle, 4096);
|
|
if ($start <= $n && trim($str) != '') {
|
|
$encode = mb_detect_encoding($str, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
|
|
if($encode){
|
|
$str = mb_convert_encoding($str, 'UTF-8', $encode);
|
|
}else {
|
|
$str = mb_convert_encoding($str, 'UTF-8');
|
|
}
|
|
if($callback){
|
|
$data[] = call_user_func($callback, $str);
|
|
}else {
|
|
$data[] = $str;
|
|
}
|
|
}
|
|
if ($end == $n) break;
|
|
}
|
|
fclose($handle);
|
|
return $data;
|
|
}
|
|
} |