Directorylisting selberbauen

meilon

Erfahrenes Mitglied
Hi,
Da mir das schnöde Directorylisting von meinem Apache-Server zu langwilig aussah, wollte ich mir das ma selber bauen.
Soweit ist auch schon alles fertig. Nur selber sortieren kann man nicht. Und da weiß ich nicht weiter. Hier erstmal mein Code (ist jetzt logisch mit fast keinen schöhnmachern ;))
PHP:
<?php

function cmp($a, $b) {
   return strcmp(strtolower($a), strtolower($b));
}

$content = scandir("/opt/lampp/htdocs/dir");

unset($content[0]);
unset($content[1]);
unset($content[2]);
unset($content[array_search("index.php", $content)]);
unset($content[array_search("dirlist.php", $content)]);
unset($content[array_search(".htaccess", $content)]);
usort($content, "cmp"); 

echo "<tr>
	<td style='border-bottom-style: solid; border-bottom-width: 1; border-color: #000000'>#</td>
	<td style='border-bottom-style: solid; border-bottom-width: 1; border-color: #000000'>Name</td>
	<td style='border-bottom-style: solid; border-bottom-width: 1; border-color: #000000'>Größe</td>
	<td style='border-bottom-style: solid; border-bottom-width: 1; border-color: #000000'>Datum</td>
	<td style='border-bottom-style: solid; border-bottom-width: 1; border-color: #000000'>Rechte</td>
	</tr>";

	function DownloadSize($file) {
	  $size = @filesize($file);
	  $sizes = Array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB');
	  $ext = $sizes[0];
	  for ($i=1; (($i < count($sizes)) && ($size >= 1024)); $i++) {
	   $size = $size / 1024;
	   $ext  = $sizes[$i];
	  }
	  return round($size, 2).$ext;
	}


for ($i = 0; $i <= count($content)-1; $i++) {
	$filename = $content[$i];
	$filesize = DownloadSize($content[$i]);
	if ($filesize == "0B") {
		$filesize = "2GB+";
		$info1 = 'einblenden(\'info\', \'<font size=-1><font color=#FF0000><b>Achtung:</b></font> Die Datei '.$filename.' lässt sich wegen<br>ihrer größe von über 2GB nicht downloaden! Also ignorieren Sie einfach den Link.</font>\');';
		$info2 = 'ausblenden(\'info\');';
	} else {
		$info1 = '';
		$info2 = '';
	}
	$filedate = date("d.m.Y H:i",@filemtime($content[$i]));
	if ($filedate == "01.01.1970 01:00") $filedate = "unbekannt";
	
	$fileperm = substr(sprintf('%o', @fileperms($content[$i])), -4);
	if ($fileperm == "0") $fileperm = "unbekannt";
	
	echo '<tr id="'.$i.'" onmousemove="an(\''.$i.'\');'.$info1.'" onmouseout="aus(\''.$i.'\');'.$info2.'">
		<td>'.$i.'</td>
		<td><a href="'.$filename.'">'.$filename.'</a></td>
		<td>'.$filesize.'</td>
		<td>'.$filedate.'</td>
		<td>'.$fileperm.'</td></tr>';
}
//}

?>
Das mit dem einblenden und ausblenden ist nur ein selbstgebautes QuickInfo.
Ich weiß nun nicht, wie ich das neusortieren nach Datum machen kann. Irgendwie muss das ja eine neues, mehrdimensionales Array werden, nur wie? Und wie das dann sortiert werden soll, will ich versuchen mir selbst zu erfummeln.

Bitte helft
mfg
 
Hallo dieser Code gibt das änderungsdatum einer Datei aus.

filetime()
hier hab ich mal was gefunden:

PHP:
<?php
echo "Letzte Änderung: ";
$filedate = filemtime($PATH_TRANSLATED);
echo date("d.m.Y H:i:s", $filedate);
?>

PS erzeug 2 neue Arrays eins mit datum und das Andere mit Zeitstempel.
Schau mal hier zum sortieren

http://www.planetcoding.net/thread/postid/9869/planetcoding.html
 
Zuletzt bearbeitet von einem Moderator:
Danke,
Das mit dem Änderungsdatum ist ne gute Sache.und der Thread ist auch ganz informativ, aber leider hilft mir der nicht sonderlich
 
Ich sortiere so etwas, indem ich alle Attribute in ein assoziatives Array schreibe und dieses Array dann an ein Array $files anhänge.
Dann kann man mit usort und einer eigenen Vergleichsfunktion sortieren.
Ein Beispiel, wie man mehrdimensionale Arrays, in denen die 2. Dimension assoziativ ist, sortiert, findet sich auch unter dem Link. Das wäre dann genau der Fall hier.

Gruß hpvw
 
Danke für die Sortierungsmöglichkeiten, aber mich interresiert mehr, wie ich ein mehrdiemsionales Array erstellen kann, kann ja nicht einfach array( "filename" => "testdatei.tar", "filesize" => 1024567, "filedate" => 102485774, "filename" ...) machen, dass muss ja bei mir irgendwie in die Schleife.

mfg
 
Ach so, na dann:
PHP:
$dateien=array();
while (dateiensuche) {
   //...
   $datei=array();
   $datei['name']=$dateiname;
   $datei['size']=$dateisize;
   $datei['attributes']=$dateiattributes;
   $datei['changedate']=$changedate;
   //...
   $dateien[]=$datei;
}
//sortieren
foreach ($dateien as $datei) {
    echo $datei['name'];
   //etc.
}

Edit: zu früh versehentlich das Formular abgeschickt
 
Jo, danke. Hat mir sehr geholfen. Muss z.Zt aber 2 Sortieralgorythmen benutzten, wegen der Case-insensitetivät (komisches Wort :-)). Wenn jemand gerade eine Funktion hat, mit der man Mehrdimensionale Array's Case-insensitiv auf- und abwärts sortieren lassen kann, währe ich über einen Post/PM sehr dankbar.

mfg
 
Das kannst Du in Deiner Callback-Vergleichsfunktion machen, indem Du im Vergleich mit strtolower() die zu vergleichenden Attribute "plattmachst". Ich glaube zu der Sortierfunktion gibts auch noch ein Rückwärtspandon, aber zur Not kannst Du ja auch auf Grund einer globalen Variablen in Deiner Callbackfunktion vor dem return das Ergebnis mit -1 malnehmen.
 
Zurück