diff options
Diffstat (limited to 'vendor/nelexa/zip/src/PhpZip/Util/FilesUtil.php')
-rw-r--r-- | vendor/nelexa/zip/src/PhpZip/Util/FilesUtil.php | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/vendor/nelexa/zip/src/PhpZip/Util/FilesUtil.php b/vendor/nelexa/zip/src/PhpZip/Util/FilesUtil.php new file mode 100644 index 0000000..29e8688 --- /dev/null +++ b/vendor/nelexa/zip/src/PhpZip/Util/FilesUtil.php @@ -0,0 +1,228 @@ +<?php + +namespace PhpZip\Util; + +use PhpZip\Util\Iterator\IgnoreFilesFilterIterator; +use PhpZip\Util\Iterator\IgnoreFilesRecursiveFilterIterator; + +/** + * Files util. + * + * @author Ne-Lexa alexey@nelexa.ru + * @license MIT + */ +class FilesUtil +{ + + /** + * Is empty directory + * + * @param string $dir Directory + * @return bool + */ + public static function isEmptyDir($dir) + { + if (!is_readable($dir)) { + return false; + } + return count(scandir($dir)) === 2; + } + + /** + * Remove recursive directory. + * + * @param string $dir Directory path. + */ + public static function removeDir($dir) + { + $files = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::CHILD_FIRST + ); + foreach ($files as $fileInfo) { + $function = ($fileInfo->isDir() ? 'rmdir' : 'unlink'); + $function($fileInfo->getRealPath()); + } + rmdir($dir); + } + + + /** + * Convert glob pattern to regex pattern. + * + * @param string $globPattern + * @return string + */ + public static function convertGlobToRegEx($globPattern) + { + // Remove beginning and ending * globs because they're useless + $globPattern = trim($globPattern, '*'); + $escaping = false; + $inCurrent = 0; + $chars = str_split($globPattern); + $regexPattern = ''; + foreach ($chars as $currentChar) { + switch ($currentChar) { + case '*': + $regexPattern .= ($escaping ? "\\*" : '.*'); + $escaping = false; + break; + case '?': + $regexPattern .= ($escaping ? "\\?" : '.'); + $escaping = false; + break; + case '.': + case '(': + case ')': + case '+': + case '|': + case '^': + case '$': + case '@': + case '%': + $regexPattern .= '\\' . $currentChar; + $escaping = false; + break; + case '\\': + if ($escaping) { + $regexPattern .= "\\\\"; + $escaping = false; + } else { + $escaping = true; + } + break; + case '{': + if ($escaping) { + $regexPattern .= "\\{"; + } else { + $regexPattern = '('; + $inCurrent++; + } + $escaping = false; + break; + case '}': + if ($inCurrent > 0 && !$escaping) { + $regexPattern .= ')'; + $inCurrent--; + } elseif ($escaping) { + $regexPattern = "\\}"; + } else { + $regexPattern = "}"; + } + $escaping = false; + break; + case ',': + if ($inCurrent > 0 && !$escaping) { + $regexPattern .= '|'; + } elseif ($escaping) { + $regexPattern .= "\\,"; + } else { + $regexPattern = ","; + } + break; + default: + $escaping = false; + $regexPattern .= $currentChar; + } + } + return $regexPattern; + } + + /** + * Search files. + * + * @param string $inputDir + * @param bool $recursive + * @param array $ignoreFiles + * @return array Searched file list + */ + public static function fileSearchWithIgnore($inputDir, $recursive = true, array $ignoreFiles = []) + { + $directoryIterator = $recursive ? + new \RecursiveDirectoryIterator($inputDir) : + new \DirectoryIterator($inputDir); + + if (!empty($ignoreFiles)) { + $directoryIterator = $recursive ? + new IgnoreFilesRecursiveFilterIterator($directoryIterator, $ignoreFiles) : + new IgnoreFilesFilterIterator($directoryIterator, $ignoreFiles); + } + + $iterator = $recursive ? + new \RecursiveIteratorIterator($directoryIterator) : + new \IteratorIterator($directoryIterator); + + $fileList = []; + foreach ($iterator as $file) { + if ($file instanceof \SplFileInfo) { + $fileList[] = $file->getPathname(); + } + } + return $fileList; + } + + /** + * Search files from glob pattern. + * + * @param string $globPattern + * @param int $flags + * @param bool $recursive + * @return array Searched file list + */ + public static function globFileSearch($globPattern, $flags = 0, $recursive = true) + { + $flags = (int)$flags; + $recursive = (bool)$recursive; + $files = glob($globPattern, $flags); + if (!$recursive) { + return $files; + } + foreach (glob(dirname($globPattern) . '/*', GLOB_ONLYDIR | GLOB_NOSORT) as $dir) { + $files = array_merge($files, self::globFileSearch($dir . '/' . basename($globPattern), $flags, $recursive)); + } + return $files; + } + + /** + * Search files from regex pattern. + * + * @param string $folder + * @param string $pattern + * @param bool $recursive + * @return array Searched file list + */ + public static function regexFileSearch($folder, $pattern, $recursive = true) + { + $directoryIterator = $recursive ? new \RecursiveDirectoryIterator($folder) : new \DirectoryIterator($folder); + $iterator = $recursive ? new \RecursiveIteratorIterator($directoryIterator) : new \IteratorIterator($directoryIterator); + $regexIterator = new \RegexIterator($iterator, $pattern, \RegexIterator::MATCH); + $fileList = []; + foreach ($regexIterator as $file) { + if ($file instanceof \SplFileInfo) { + $fileList[] = $file->getPathname(); + } + } + return $fileList; + } + + /** + * Convert bytes to human size. + * + * @param int $size Size bytes + * @param string|null $unit Unit support 'GB', 'MB', 'KB' + * @return string + */ + public static function humanSize($size, $unit = null) + { + if (($unit === null && $size >= 1 << 30) || $unit === "GB") { + return number_format($size / (1 << 30), 2) . "GB"; + } + if (($unit === null && $size >= 1 << 20) || $unit === "MB") { + return number_format($size / (1 << 20), 2) . "MB"; + } + if (($unit === null && $size >= 1 << 10) || $unit === "KB") { + return number_format($size / (1 << 10), 2) . "KB"; + } + return number_format($size) . " bytes"; + } +} |