<?php
/**
* Verzeichnisklasse zum Auslesen von Dateien
*
* Klasse zum rekursiven Auslesen von Dateien, ausgehend von einem Startordner
* Das Ergebnis wird in ein Array geschrieben mit den folgenden Informationen:
* - Pfad
* - Dateiname
* - Dateigröße
* - Datum der letzten Änderung (UNIX-Timestamp)
* Optionen:
* - Festlegen des Startverzeichnisses
* - Ordner vorgeben, die nicht ausgelesen werden sollen
* - Festlegen von Dateitypen, die nicht erfaßt werden sollen
* - Angabe über spezielle Dateien, die nicht erfaßt werden sollen
* Vorgaben
* - kann derzeit nur von einer anderen Klasse zur Verarbeitung genutzt werden (siehe protected function)
* - alternativ sollten alle Methoden mit der Sichtbarkeit protected auf public gesetztz werden
*
* Systemvorrausetzungen
* - PHP 5.1 oder höher
*
* Benötigte Dateien
* - Dir.class.php
* - DirExceptions.class.php
*
* Lizenz: MIT License
*
* @package Suchfunktion und Google-Sitemap
* @author Peter Kropff <mail@peterkropff.de>
* @license http://de.wikipedia.org/wiki/MIT-Lizenz
* @version 1.0
*
* Benutzung (Beispiel)
* meineKlasse.class.php
*
* require_once (Dir.class.php);
* class meineKlasse extends Dir
* {
* $root = $_SERVER['DOCUMENT_ROOT'].'/folder';
* $filetype = array ('.php','.htm');
* $deny_folder = array ('bla', 'blubb', 'blubber');
* $deny_files = array ('db.php', 'print.php', 'google123456789.html');
* $this -> setRoot ($root);
* $this -> denyFolder ($folder);
* $this -> denyFiletype ($filetype);
* $this -> denySpecialFiles ($files);
* $result = $this -> startSearch();
* }
*
* Anmerkung:
* die folgenden Methoden müssen nicht aufgerufen werden, wenn keine Einschränkungen benötigt werden
* - $this -> denyFolder ($folder);
* - $this -> denyFiletype ($filetype);
* - $this -> denySpecialFiles ($files);
*
*/
/**
* Exception-Klasse für Fehler einbinden
*/
require_once ('DirExceptions.class.php');
/**
* Die Verzeichnisklasse
*/
class Dir
{
/**
* Startverzeichnis
* @var string
* @access private
*/
private $root;
/**
* Ordner von der Erfassung ausklammern
* @var array
* @access private
*/
private $deny = array ();
/**
* Bestimmte Dateitypen ausklammern
* @var array
* @access private
*/
private $filetype = array ();
/**
* Spezielle Dateien ausklammern
* @var array
* @access private
*/
private $special_files = array ();
/**
* Das Ergebnis als Array
* @var array
* @access private
*/
private $files = array ();
/**
* Festlegen des Startverzeichnisses
* Überprüfung auf existierenden Startordner
*/
protected function setRoot($var)
{
if (is_dir ($var))
{
$this -> root = $var;
}
else
{
/**
* Wenn Startordner nicht vorhanden ist, dann die
* entsprechende Exception-Meldung ausgeben
*/
throw new fatalerror_exception ('Der Ordner '.$var.' ist nicht vorhanden!');
}
}
/**
* Festlegen der nicht zu erfassenden Ordner
* Wenn $var kein Array, dann Fehlermeldung über Type Hinting
*/
protected function denyFolder(array $var)
{
$this -> deny = $var;
}
/**
* Festlegen der erlaubten Dateitypen
* Wenn $var kein Array, dann Fehlermeldung über Type Hinting
*/
protected function denyFiletype(array $var)
{
$this -> filetype = $var;
}
/**
* Festlegen der speziell verbotenenen Dateien
* Wenn $var kein Array, dann Fehlermeldung über Type Hinting
*/
protected function denySpecialFiles(array $var)
{
$this -> special_files = $var;
}
/**
* Suche starten, gibt im Erfolgsfall $files als Array zurück
* mit folgenden Schlüsseln
* - path
* - file
* - size
* - time
*/
protected function startSearch()
{
/**
* Aufruf der Hauptmethode doNavigate zum Einlesen der Dateien
*/
$this -> doNavigate();
if ($this -> files)
{
/**
* Gibt im Erfolgsfall das Ergebnis als Array zurück
*/
return $this -> files;
}
else
{
/**
* Gibt Fehlermeldung aus, wenn keine Dateien erfaßt wurden
*/
throw new fatalerror_exception ('Keine Daten vorhanden', 0);
}
}
/**
* rekursive Hauptmethode zum Einlesen von Dateien
*/
private function doNavigate()
{
/**
* "temporäres" Array zum späteren sortieren
*/
$sort = array ();
/**
* Wenn Verzeichnis existiert
*/
if ($handle = opendir ($this -> root))
{
/**
* Ordern und Dateien im "temopäres" Array $sort einlesen
*/
while ($found = readdir ($handle))
{
if ($found != '.' && $found != '..')
{
$sort[] = $this -> root.'/'.$found;
}
}
/**
* Überprüfung, ob $sort Inhalte hat
*/
if (count ($sort) > 0)
{
/**
* natürliche Sortierung des Arrays $sort
*/
natcasesort($sort);
/**
* Array $sort durchlaufen
*/
foreach ($sort as $var)
{
/**
* Wenn Ordner
*/
if (is_dir ($var))
{
/**
* Methode für das Setzen des aktuellen Verzeichnisses aufrufen
*/
$this -> setFolder ($var);
/**
* Rekursion, Funktion ruft sich selber auf
*/
$this -> doNavigate();
}
/**
* Wenn Datei
*/
else if (is_file($var))
{
/**
* Methode zum Schreiben der Informationen aufrufen
*/
$this -> setFile ($var);
}
}
}
/**
* Verzeichnis-Handle schließen
*/
closedir($handle);
}
else
{
/**
* Keine Leserechte mit entsprechender Exception
*/
throw new fatalerror_exception ('Keine Zugriffsrechte auf '.$this -> root);
}
}
/**
* Aktuellen Ordner festlegen und überprüfen
*/
private function setFolder($folder)
{
/**
* Methode zur Überprüfen verbotener Ordner aufrufen
*/
if (!$this -> checkFolder($folder))
{
/**
* Aktuellen Ordner festlegen
*/
$this -> root = $folder;
}
}
/**
* Methode zur Überprüfung der erlaubten Ordner
*/
private function checkFolder($folder)
{
/**
* Schleife zur Überprüfung aller verbotenen Ordner
*/
foreach ($this -> deny as $forbidden)
{
/**
* Pfad in Einzelordner zerlegen
*/
$tmp = explode ('/', $folder);
/**
* Überprüfung des aktuellen Ordners
*/
if ($tmp[count($tmp) -1] == $forbidden)
{
/**
* wenn verboten, true zurückgeben und abbrechen
*/
return true;
break;
}
}
}
/**
* Methode zur Erfassung der gewünschten Inhalte
*/
private function setFile($file)
{
/**
* Methoden zur Überprüfung der erlaubten Dateiendungen und
* verbotenen Dateien aufrufen
*/
if ($this -> checkFiletype($file) && !$this -> checkSpecialFiles ($file))
{
/**
* Dateigröße
*/
$filesize = filesize ($file);
/**
* letzte Änderung
*/
$filetime = filemtime ($file);
/**
* Position des letzen /
*/
$mark = strrpos ($file, "/");
/**
* Position des letzen /
*/
$path = substr ($file, 0, $mark);
/**
* Dateinamen ohne Pfadangabe
*/
$file = substr ($file, $mark + 1);
/**
* Informationen in Eigenschaft (Array) files schreiben
*/
$this -> files[] = array (
'path' => $path,
'file' => $file,
'size' => $filesize,
'time' => $filetime
);
}
}
/**
* Methode zur Überprüfung der gewünschten Dateitypen
*/
private function checkFiletype($file)
{
/**
* Schleife zur Überprüfung aller erlaubten Dateien
*/
foreach ($this -> filetype as $valid)
{
/**
* wenn Dateiendung paßt, true zurückgeben und abbrechen
*/
if (substr ($file, - strlen($valid)) == $valid)
{
return true;
break;
}
}
}
/**
* Methode zur Überprüfung der verbotenen Dateien
*/
private function checkSpecialFiles($file)
{
/**
* Schleife zur Überprüfung aller speziell verbotenten Dateien
*/
foreach ($this -> special_files as $invalid)
{
/**
* Datei aus Pfad extrahieren
*/
$tmp = explode ('/', $file);
$tmp_file = $tmp[(count($tmp) - 1)];
/**
* wenn Datei verboten ist, true zurückgeben und abbrechen
*/
if ($tmp_file == $invalid) {
return true;
break;
}
}
}
}
?>