2

我正在寻找可以递归地显示主文件夹中每个文件夹大小的东西。

这是一个带有 CGI-Bin 的LAMP服务器,因此大多数 PHP 脚本都应该可以工作,或者任何可以在 CGI-Bin 中工作的东西。

我的托管公司没有提供界面让我查看哪些文件夹占用的空间最多。我不知道互联网上的任何内容,并进行了一些搜索,但我没有找到任何结果。

实现图表(GD / ImageMagick)的东西是最好的,但不是必需的。

我的主机只支持 CGI-BIN 中的 Perl。

4

3 回答 3

6

奇怪的是,我在谷歌上找到了很多相关的结果,而这一个可能是最完整的。

函数“getDirectorySize”将忽略文件/目录的链接/快捷方式。函数“sizeFormat”将相应地以字节、KB、MB 或 GB 为大小后缀。

代码

function getDirectorySize($path)
{
  $totalsize = 0;
  $totalcount = 0;
  $dircount = 0;
  if ($handle = opendir ($path))
  {
    while (false !== ($file = readdir($handle)))
    {
      $nextpath = $path . '/' . $file;
      if ($file != '.' && $file != '..' && !is_link ($nextpath))
      {
        if (is_dir ($nextpath))
        {
          $dircount++;
          $result = getDirectorySize($nextpath);
          $totalsize += $result['size'];
          $totalcount += $result['count'];
          $dircount += $result['dircount'];
        }
        elseif (is_file ($nextpath))
        {
          $totalsize += filesize ($nextpath);
          $totalcount++;
        }
      }
    }
  }
  closedir ($handle);
  $total['size'] = $totalsize;
  $total['count'] = $totalcount;
  $total['dircount'] = $dircount;
  return $total;
}

function sizeFormat($size)
{
    if($size<1024)
    {
        return $size." bytes";
    }
    else if($size<(1024*1024))
    {
        $size=round($size/1024,1);
        return $size." KB";
    }
    else if($size<(1024*1024*1024))
    {
        $size=round($size/(1024*1024),1);
        return $size." MB";
    }
    else
    {
        $size=round($size/(1024*1024*1024),1);
        return $size." GB";
    }

}

用法

$path="/httpd/html/pradeep/";
$ar=getDirectorySize($path);

echo "<h4>Details for the path : $path</h4>";
echo "Total size : ".sizeFormat($ar['size'])."<br>";
echo "No. of files : ".$ar['count']."<br>";
echo "No. of directories : ".$ar['dircount']."<br>"; 

输出

Details for the path : /httpd/html/pradeep/
Total size : 2.9 MB
No. of files : 196
No. of directories : 20
于 2008-08-27T08:49:05.547 回答
1

如果你有 shell 访问权限,你可以运行命令

$ du -h

或者也许使用这个,如果 PHP 被配置为允许执行:

<?php $d = escapeshellcmd(dirname(__FILE__)); echo nl2br(`du -h $d`) ?>
于 2008-08-28T09:38:50.867 回答
0

number_files_and_size.php

<?php
if (isset($_POST["nivel"])) {
        $mostrar_hasta_nivel = $_POST["nivel"];
        $comenzar_nivel_inferior = $_POST["comenzar_nivel_inferior"];
        // $mostrar_hasta_nivel = 3;

        global $nivel_directorio_raiz;
        global $nivel_directorio;

        $path = dirname(__FILE__);
        if ($comenzar_nivel_inferior == "si") {
            $path = substr($path, 0, strrpos($path, "/"));
        }
        $nivel_directorio_raiz = count(explode("/", $path)) - 1;
        $numero_fila = 1;


        // Comienzo de Tabla
        echo "<table border='1' cellpadding='3' cellspacing='0'>";
        // Fila encabezado
        echo "<tr style='font-size: 100%; font-weight: bold;' bgcolor='#e2e2e2'><td></td><td>Ruta</td><td align='center'>Nivel</td><td align='right' style='color:#0000ff;'>Ficheros</td><td align='right'>Acumulado fich.</td><td align='right'>Directorio</td><td align='right' style='color:#0000ff;'>Tama&ntilde;o</td><td align='right'>Acumulado tama&ntilde;o</td></tr>";
        // Inicio Filas de datos
        echo "<tr>";

        //Función que se invoca a si misma de forma recursiva según recorre el directorio raiz ($path)
        FileCount($path, $mostrar_hasta_nivel, $nivel_directorio_raiz); 

        // Din Filas de datos
        echo "</tr>";
        // Fin de tabla
        echo "</table>";
        echo "<div style='font-size: 120%;'>";
        echo "<br>Total ficheros en la ruta <b><em>" . $path . ":</em> " . number_format($count,0,",",".") . "</b><br>";
        echo "Tama&ntilde;o total ficheros: <b>". number_format($acumulado_tamanho, 0,",",".") . " Kb.</b><br>";
        echo "</div>";

        echo "<div style='min-height: 60px;'></div>";

} else {
    ?>
    <form name="formulario" id="formulario" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
        <br /><h2>Informe del Alojamiento por directorios (N&uacute;mero de Archivos y Tama&ntilde;o)</h2>
        <br />Nivel de directorios a mostrar: <input type="text" name="nivel" id="nivel" value="3"><br /><br />
        <input type="checkbox" name="comenzar_nivel_inferior" value="si" checked="checked"/> Comenzar en nivel de directorio inmediatamente inferior a la ubicaci&oacute;n de este m&oacute;dulo PHP<br />(<?php echo dirname(__FILE__) ?>)<br /><br />
        <input type="submit" name="comenzar" id="comenzar" value="Comenzar proceso"><br /><br />
    </form>
    <?php
}




function FileCount($dir, $mostrar_hasta_nivel, $nivel_directorio_raiz){
    global $count;
    global $count_anterior;
    global $suma_tamanho;
    global $acumulado_tamanho;

    $arr=explode('&',$dir);
    foreach($arr as $val){
        global $ruta_actual;

        if(is_dir($val) && file_exists($val)){
            global $total_directorio;
            global $numero_fila;
            $total_directorio = 0;

            $ob=scandir($val);
            foreach($ob as $file){
                if($file=="."||$file==".."){
                    continue;
                }
                $file=$val."/".$file;

                if(is_file($file)){
                    $count++;
                    $suma_tamanho = $suma_tamanho + filesize($file)/1024;
                    $acumulado_tamanho = $acumulado_tamanho + filesize($file)/1024;
                    $total_directorio++;
                } elseif(is_dir($file)){
                    FileCount($file, $mostrar_hasta_nivel, $nivel_directorio_raiz);
                }
            }

            $nivel_directorio = count(explode("/", $val)) - 1;

            if ($nivel_directorio > $mostrar_hasta_nivel) {
            } else {
                $atributo_fila = (($numero_fila%2)==1 ? "background-color:#ffffff;" : "background-color:#f2f2f2;");
                echo "<tr style='".$atributo_fila."'><td>".$numero_fila."</td><td>".$val."&nbsp;&nbsp;&nbsp;&nbsp;</td><td align='center'>".$nivel_directorio."</td><td align='right' style='color:#0000ff;'>".number_format(($count - $count_anterior),0,",",".")."</td><td align='right'>".number_format($count,0,",",".")."</td><td align='right'>".number_format($total_directorio,0,",",".")."</td><td align='right' style='color:#0000ff;'>".number_format($suma_tamanho,0,",",".")." Kb.</td><td align='right'>".number_format($acumulado_tamanho,0,",",".")." Kb.</td></tr>";

                $count_anterior = $count;
                $suma_tamanho = 0;
                $numero_fila++;
            }

        }
    }
}
?>
于 2016-09-01T10:48:46.200 回答