احصل على أحجام الدليل على مضيف بعيد باستخدام برنامج PHP النصي
سؤال
أنا أبحث عن شيء يُظهر لي حجم كل مجلد داخل مجلدي الرئيسي بشكل متكرر.
هذا ال خروف خادم مزود بـ CGI-Bin، لذلك يجب أن يعمل معظم برنامج PHP النصي أو أي شيء سيعمل في CGI-Bin.
لا توفر لي شركة الاستضافة الخاصة بي واجهة لمعرفة المجلدات التي تستهلك أكبر قدر من المساحة.لا أعرف أي شيء على الإنترنت وقمت ببعض عمليات البحث ولكنني لم أتوصل إلى أي نتائج.
شيء ينفذ الرسوم البيانية (جي دي/ImageMagick) سيكون الأفضل ولكنه غير مطلوب.
يدعم مضيفي لغة Perl فقط في CGI-BIN.
المحلول
غريب، جئت على جوجل مع العديد من النتائج ذات الصلة و هذا ربما يكون الأكثر اكتمالا.
ستتجاهل وظيفة "getDirectorySize" الارتباط/shorcuts للملفات/الدليل.سوف تستمتع وظيفة "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
نصائح أخرى
إذا كان لديك حق الوصول إلى Shell، فيمكنك تشغيل الأمر
$ du -h
أو ربما استخدم هذا، إذا تم تكوين PHP للسماح بالتنفيذ:
<?php $d = escapeshellcmd(dirname(__FILE__)); echo nl2br(`du -h $d`) ?>
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ño</td><td align='right'>Acumulado tamañ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ñ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úmero de Archivos y Tamañ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ón de este mó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." </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++;
}
}
}
}
?>