Entwicklung - PHP - Rekursives Auslesen von Verzeichnissen und Ermitteln von geänderten Dateien

PHP: Rekursives Auslesen von Verzeichnissen und Ermitteln von geänder...

rob (53)

rob

12.08.2002 00:42

Vinn

  • 323 Postings, noch 27 bis zum nächsten Level (350)

Postings: 323

Rekursives Auslesen von Verzeichnissen und Ermitteln von geänderten Dateien

Mittwoch, 28. Juli 2004 16:30

  • 0.0/6 Votes: 0
0.0/6 Votes: 0

Am folgenden einfachen aber nützlichen Beispiel soll hier ein rekursives Aufrufen von Funktionen vorgestellt werden.
es wird eine Klasse zum Ermitteln von geänderten Dateien in einem Verzeichnis mit Unterverzeichnissen erstellt.

für unsere Klasse CDirHandler benötigen wir nur die Klassenvariable, welcher dann im Konstruktor ersteinmal als leeres Array definiert wird.

var $_aAllFiles;

// --| CONSTRUCTOR |------------
function CDirHandler(
){
$this->_aAllFiles = array();
}//CFileUpload()...

als nützliche Funktion hat sich in fast jeder Klasse eine Fehlerbehandlung erwiesen -
hier werden Fehlermeldungen mit der PHP-Funktion error-log() in eine Log-Datei geschrieben.

function setErrorLog(
$sError
){
error_log (date("j.n.Y H:i:s")." - ". $sError . "\n", 3, "dir_handler.error.log");
$this->_bError = 1;
}//setErrorLog()...

in der Funktion getFiles wird zuerst die Funktion getDirContent aufgerufen,
an Hand der im Verzeichnis vorhandenen Dateien wird dann kontrolliert ob es sich um eine Datei oder ein weiteres Verzeichnis handelt.
Dateien werden in ein Array geschrieben, falls das Datum der Datei größer als der Kontrollzeitpunkt ist
und falls es sich um ein Verzeichnis handelt ruft sich die Funktion nochmals selbst auf - fertig ist unsere Rekursion.
als Ergebnis wird ein Array zurückgegeben, welches alle Dateien enthält, die ab einem bestimmten Datum ($iLastcheck) geändert wurden.

function getFiles($sDirectory, $iLastcheck)
{
$aFile = $this->getDirContent($sDir);
foreach($aFile as $file2)
{
//ignore if filename '.' or '..'
if ($file2 != "." && $file2 != "..")
{
if(is_dir($sDir ."/". $file2))
$this->getFiles($sDir ."/". $file2, $iLastcheck);
elseif(is_file($sDir ."/". $file2))
{
if(filemtime($sDir ."/". $file2) >= $iLastcheck)
$this->_aAllFiles[] = $sDir ."/". $file2;
}
}
}
return $this->_aAllFiles;
}//getFiles()...

In dieser Funktion wird einfach der Inhalt eines Verzeichnisses ausgelesen, wenn das Verzeichnis existiert.
Im Fehlerfall wird ein Log-Eintrag über die Funktion setErrorLog() generiert.

function getDirContent($sDir)
{
$aFile = array();
if (file_exists($sDir))
{
$hDir = @opendir($sDir);
while ($file = @readdir($hDir))
$aFile[] = $file;
@closedir($hDir);
}
else
setErrorLog('File $sDir konnte nicht geöffnet werden');
return $aFile;
}//getDirContent()...

das ganze Script als Klasse gibt es hier.

Bookmark setzen!:Zu Google Bookmark hinzufügen.Zu bloglines hinzufügen.Zu Newsgator hinzufügen.Zu FURL hinzufügen.Zu DIGG hinzufügen.Zu Webnews hinzufügen.Zu Netscape hinzufügen.Zu Yahoo MyWeb hinzufügen.Zu spurl.net hinzufügen.Zu diigo hinzufügen.Zu Newsvine hinzufügen.Zu del.icio.us hinzufügen.Zu SIMPIFY hinzufügen.Zu Mister Wong hinzufügen.Zu Linkarena hinzufügen.Zu isio.de hinzufügen.Zu Oneview hinzufügen.Zu yigg.de hinzufügen.Zu reddit hinzufügen.Zu StumbleUpon hinzufügen.Zu Slashdot hinzufügen.Zu Blinklist hinzufügen.Zu Technorati hinzufügen.Zu Blogmarks hinzufügen.Zu Blinkbits hinzufügen.Zu ma.gnolia hinzufügen.Zu smarking.com hinzufügen.Zu Netvouz hinzufügen.Zu co.mments hinzufügen.Zu Connotea hinzufügen.Zu de.lirio.us hinzufügen.

Specials

Bytefresser Specials: Anno 1404

Umfrage

Welches ist Dein Lieblings-Anno?

(17 Stimmen)

1. Ganz klar: Anno 1800!
2. Anno 2205
3. Anno 2070
4. Anno 1404
5. Anno 1701
6. Anno 1503
7. Anno 1602
8. Anno Online

Benutzer-Counter

Besucher gesamt: 1.160.066
Besucher heute: 12
Besucher gestern: 73
Max. Besucher/Tag: 900
Gerade online: 8
Max. online: 77
Seiten gesamt: 18.116.980
Aufrufe diese Seite: 462

Tag-Cloud

  @closedir     cfileupload     @opendir     mittwoch     funktion     bookmark     klasse     log-eintrag     aufrufen     fehlermeldungen     fehlerbehandlung     inhalt     _aallfiles     fehlerfall     auslesen     beispiel     log-datei     dateien     script     verzeichnissen     über     signatur     rekursives     @readdir     level     postings     ermitteln     bytefresser     php-funktion     entwicklung