WinFuture-Forum.de: Dir_size von zwei Ordnern - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Dir_size von zwei Ordnern


#1 Mitglied ist offline   PaulF 

  • Gruppe: Mitglieder
  • Beiträge: 9
  • Beigetreten: 15. Juli 15
  • Reputation: 0

geschrieben 20. März 2016 - 11:38

Mein aktueller Code gibt nur einen Ordner aus, ich bräuchte dieses aber für zwei. Hilfe?

<?php
    $units = explode(' ', 'B KB MB GB TB PB');
    $SIZE_LIMIT = 53687091; // 50 MB
    $disk_used = foldersize("/var/customers/webs/xyz/root/");

    $disk_remaining = $SIZE_LIMIT - $disk_used;

    echo('Full website size: ' . format_size($disk_used));

function foldersize($path) {
    $total_size = 0;
    $files = scandir($path);
    $cleanPath = rtrim($path, '/'). '/';

    foreach($files as $t) {
        if ($t<>"." && $t<>"..") {
            $currentFile = $cleanPath . $t;
            if (is_dir($currentFile)) {
                $size = foldersize($currentFile);
                $total_size += $size;
            }
            else {
                $size = filesize($currentFile);
                $total_size += $size;
            }
        }   
    }

    return $total_size;
}


function format_size($size) {
    global $units;

    $mod = 1024;

    for ($i = 0; $size > $mod; $i++) {
        $size /= $mod;
    }

    $endIndex = strpos($size, ".")+3;

    return substr( $size, 0, $endIndex).' '.$units[$i];
}

?>
 



0

Anzeige



#2 Mitglied ist offline   Sturmovik 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.776
  • Beigetreten: 10. Januar 08
  • Reputation: 445
  • Geschlecht:unbekannt
  • Wohnort:In Reichweite der Kaffeemaschine
  • Interessen:IT, Luftfahrt, historische Technik

geschrieben 20. März 2016 - 12:07

Jetzt mal grob aus der Hüfte geschossen:

alle fraglichen Pfade in ein Array schreiben,

foreach (@array) {
  $size = foldersize $_;
  $cumulativesize += size;
  print "Directory $_ uses $size\n";
}
print "Full website Size is $cumulatievsize\n";


Das ist jetzt allerdings Perl. In php müsstest du das noch umschreiben.

Allerdings sieht das ganze unnötig aufwändig aus, da der Code sich selbst alle Dateien in dem Projekt anschaut.

Deutlich eleganter geht das mit dem Programmchen 'du' was jedes Linuxsystem haben sollte:

du -Dcsh 'Directory1' 'Directory2' ... 'DirectoryN'

gibt dir eine Liste der Verzeichnisse mit Größe in der passenden Maßeinheit.
mit dem Schalter -b gibt er das in Bytes aus, falls du weiterrechnen willst.

Dieser Beitrag wurde von Sturmovik bearbeitet: 20. März 2016 - 12:09

«Geschichte wiederholt sich nicht, aber sie reimt sich» (Mark Twain)

Unix won't hold your hand. You wanna shoot your foot, Unix reliably delivers the shot.

True Cloudstorage
0

#3 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 20. März 2016 - 12:29

strpos() auf eine Zahl? :unsure:

--> printf('%.0d', $size); :thumbup:

Ansonsten, mh, in Anbetracht der Tatsache daß SIZE_LIMIT = 50 MB ist, wirst Du wohl nicht in die Verlegenheit kommen, ${size}s in GB-Größenordnungen berücksichtigen zu müssen. Oder darüber, was das anbelangt.

Wie schon geschrieben wirkt der Code arg aufgeblasen. Ist das Ganze für eine Website? Oder innerhalb einer Kommandozeile als Script? Insbesondere: wie portierbar muß das Ganze sein?

Ein system("du \"$path\"") ist zwar nicht sehr elegant, tut aber was es soll, jedenfalls auf unixoiden Plattformen.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#4 Mitglied ist offline   Sturmovik 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.776
  • Beigetreten: 10. Januar 08
  • Reputation: 445
  • Geschlecht:unbekannt
  • Wohnort:In Reichweite der Kaffeemaschine
  • Interessen:IT, Luftfahrt, historische Technik

geschrieben 20. März 2016 - 12:34

So, mal eben in php übersetzt und getestet:
<?php                                                                                                                
    $units = explode(' ', 'B KB MB GB TB PB');
    $SIZE_LIMIT = 53687091; // 50 MB
    $folders = array("/home/sturmovik/catvideos","/home/sturmovik/porn" );

    $disk_used = 0;
    foreach ($folders as $dir) {
        $dir_used = foldersize($dir);
        $disk_used += $dir_used;
        echo("Dir size of " . $dir . " is " . $dir_used."\n");
    }
//    $disk_used = foldersize("");

    $disk_remaining = $SIZE_LIMIT - $disk_used;

    echo('Full website size: ' . format_size($disk_used)."\n");


Die Funktionen bleiben unangetastet (alle Änderungen sind in Zeile 4-11)

Aber wie oben schon durch mich & Ralph erwähnt: unnötig aufgeblasener Code.

Und der Typ der damals angefangen hat "Directorys" in "Folders" umzubenennen gehört erschlagen, gevierteilt, frittiert und erschossen. In der Reihenfolge;

Dieser Beitrag wurde von Sturmovik bearbeitet: 20. März 2016 - 12:35

«Geschichte wiederholt sich nicht, aber sie reimt sich» (Mark Twain)

Unix won't hold your hand. You wanna shoot your foot, Unix reliably delivers the shot.

True Cloudstorage
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0