调用:保存代码修改$dir配置cmd执行
例:php findtop.php
<?php
$dir = 'D:';
$limit = 50;
//查找$dir下硬盘容量占用最多的前$limit个文件夹
//dir_size_max($dir, $limit);
//查找$dir下硬盘容量占用最多的前$limit个文件
//file_size_max($dir,$limit);
//查找文件
function file_size_max($dir, $limit)
{
$arr_file = [];
treefile($arr_file, $dir);
$res = paixufile($arr_file, $limit);
shuchu($res);
}
//查找文件夹
function dir_size_max($dir, $limit)
{
$arr_dir = [];
treedir($arr_dir, $dir);
$res = paixu_dir($arr_dir, $limit);
shuchu($res);
}
//文件夹排序
function paixu_dir($arr, $limit)
{
array_multisort(array_column($arr, 'len'), SORT_DESC, $arr);
foreach ($arr as $key=>$item){
foreach ($arr as $item1){
if($item['key']===$item1['dirkey']){
$arr[$key]['size']+=$item1['size'];
}
}
}
array_multisort(array_column($arr, 'size'), SORT_DESC, $arr);
$p = 1;
foreach ($arr as $item) {
if ($p > $limit) {
break;
}
$res[] = ['file' => $item['file'], 'size' => convertSize($item['size']),];
$p++;
}
return $res;
}
//文件排序
function paixufile($arr, $limit)
{
$res = [];
array_multisort(array_column($arr, 'size'), SORT_DESC, $arr);
$p = 1;
foreach ($arr as $item) {
if ($p > $limit) {
break;
}
$res[] = ['file' => $item['file'], 'size' => convertSize($item['size']),];
$p++;
}
return $res;
}
//输出结果
function shuchu($arr)
{
echo "\n\n";
foreach ($arr as $item) {
echo $item['size'] . ' -> ' . $item['file'] . "\n";
}
echo "\n\n";
}
//获取文件及大小
function treefile(&$arr_file, $directory)
{
$mydir = dir($directory);
while ($file = $mydir->read()) {
if ($file === '.' || $file === '..' || $file === 'System Volume Information') {
continue;
}
if ((is_dir($mydir->path . '/' . $file))) {
treefile($arr_file, $mydir->path . '/' . $file,);
} else {
$arr_file[] = [
'file' => $mydir->path . '/' . $file,
'size' => filesize($mydir->path . '/' . $file),
];
}
}
$mydir->close();
}
//获取文件夹及大小
function treedir(&$arr_dir, $directory)
{
echo $directory."\n";
if(empty($arr_dir[sha1($directory)])){
$arr_dir[sha1($directory)] = [
'dirkey' => '',
'key' => sha1($directory),
'file' => $directory,
'size' => 0,
'len' => strlen($directory),
];
}
$mydir = dir($directory);
while ($file = $mydir->read()) {
if ($file === '.' || $file === '..' || $file === 'System Volume Information') {
continue;
}
if (is_dir($mydir->path . '/' . $file)) {
$arr_dir[sha1($mydir->path . '/' . $file)] = [
'dirkey' => sha1($mydir->path),
'key' => sha1($mydir->path . '/' . $file),
'file' => $mydir->path . '/' . $file,
'size' => 0,
'len' => strlen($mydir->path . '/' . $file),
];
treedir($arr_dir, $mydir->path . '/' . $file,);
} else {
if(!empty($arr_dir[sha1($mydir->path)])){
$arr_dir[sha1($mydir->path)]['size']+=filesize($mydir->path . '/' . $file);
}
}
}
$mydir->close();
}
//容量格式化
function convertSize($size)
{
$units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB',];
for ($i = 0; $size >= 1024 && $i < count($units) - 1; $i++) {
$size /= 1024;
}
return sprintf("%10s", round($size, 3) . ' ' . $units[$i]);
}