>> Inhaltsverzeichnis >> Anleitung für Entwickler

Dateisystem

Wie erhalte ich den Inhalt von Verzeichnissen?

Die Funktion dirlist() liefert für ein Verzeichnis eine sortierte Liste der enthaltenen Dateien und Verzeichnisse als numerisches Datenfeld zurück. Die obligatorischen Verzeichniseinträge "." und ".." werden nicht aufgelistet. Dateien, deren Dateinamen mit dem Zeichen "." beginnen werden ebenfalls nicht aufgelistet. Das betrifft insbesondere Dateinamen wie ".htaccess" oder ".password". Die Dateinamen enthalten keine Pfadangaben. Verzeichnisnamen enthalten keinen abschließenden Querstrich "/".

Der optionale Parameter $filter kann verwendet werden um die Ausgabe auf bestimmte Dateiendungen zu beschränken. Wildcards sind nicht gestattet. Der Dateifilter darf lediglich alphanumerische Zeichen, sowie die Zeichen '.', '-' und '_' enthalten. Andere Zeichen werden beim Aufruf der Funktion automatisch entfernt.

alle Einträge eines Verzeichnisses ausgeben:
<?php 
echo implode("<br>"dirlist("foo/"));
?>

Ausgabe:

foo1.foo2
foo3.foo2
foo4.foo5
foo6.foo7

alle Einträge mit passender Dateiendung ausgeben:
<?php 
echo implode("<br>"dirlist('foo/''*.foo2'));
?>

Ausgabe:

foo1.foo2
foo3.foo2


... mit mehreren Dateiendungen:

<?php 
echo implode("<br>"dirlist('foo/''*.foo2|*.foo5'));
?>

Ausgabe:

foo1.foo2
foo3.foo2
foo4.foo5

objektorientierte Variante:

<?php 
$dirStream = new DirStream("foo/");
$dirStream->read();
$dirlist $dirStream->dirlist('*.foo2|*.foo5');
echo implode("<br>"$dirlist);

/* Hinweis: das Setzen des Dateifilters ist permanent. */

$dirStream->dirlist('*.foo2|*.foo5');
echo $dirStream->length();
/* Ausgabe: 2 */

echo count($dirStream->get());
/* Ausgabe: 2 */

/* Ein erneuter Aufruf von dirlist() setzt den Dateifilter neu */
$dirStream->dirlist("");
echo $dirStream->length();
/* Ausgabe: 4 */
?>

Wie kann ich Verzeichnisse anlegen oder löschen?

Die Funktionen $dirStream->create($mode) beziehungsweise $dirStream->delete() sind für Erzeugen beziehungsweise Löschen von Verzeichnissen verantwortlich. Der optionale Parameter $mode kann verwendet werden, um unter LINUX/UNIX -Betriebssystemen Zugriffsrechte von Verzeichnissen festzulegen. Der Defaultwert ist 777.

Beispiele für gültige Werte für $mode finden Sie in der folgenden Tabelle. Dabei steht "r" für "readable", "w" für "writeable" und "x" für "executable".

Besitzer Gruppe sonstige Nutzer Wert

rwx

rwx

rwx

777

rw-

rw-

---

660

rw-

rw-

rw-

666

rwx

r-x

r-x

755

rwx

r-x

---

750

rwx

---

---

700

Beispiele für gültige Werte (entsprechend Unix: CHMOD)

<?php 
$dirStream = new DirStream("foo/");
$dirStream->read();

/* erzeuge das Verzeichnis "foo/" */
$dirStream->create();

/* erzeuge das Verzeichnis "foo/" mit Zugriffsrechten 660 */
$dirStream->create(660);

/* Anzahl der Dateien in einem Verzeichnis feststellen */
print "Verzeichnis 'foo/' enthält ".$dirStream->length()." Dateien.";

/* lösche das Verzeichnis "foo/" */
$dirStream->delete();

/* lösche das Verzeichnis "foo/" inklusive aller Dateien und Unterverzeichnisse */
$dirStream->delete(true);

/* prüfe ob Verzeichnis existiert */
$test $dirStream->exists();
if ($test === true) {
    print "Verzeichnis existiert";
} else if ($test === false) {
    print "Verzeichnis existiert NICHT";
}
?>

Wie lese ich den Inhalt einer Config- oder SML-Datei?

Die Funktion SML::getFile() lädt die angegebene Konfigurationsdatei im SML-Format und liefert den Inhalt als PHP-Variable zurück.

<?php 
/* Lies Inhalte von Datei und gib Inhalte als Array zurück */
$array SML::getFile("foo.config");

/* Schlüssel in Großbuchstaben */
$array SML::getFile("foo.config"CASE_UPPER);

/* Schlüssel in kleinen Buchstaben */
$array SML::getFile("foo.config"CASE_LOWER);

/* Schlüssel so wie gespeichert (default) */
$array SML::getFile("foo.config"CASE_MIXED);

/* ... oder: */
$array SML::getFile(file("foo.config"));

/* ... oder: */
$array SML::decode(file_get_contents("foo.config"));

/* einen SML-String erzeugen und dekodieren */
$input_array  = array(1,2,3,array(4,5),'a'=>6,'B'=>7);
$output_array SML::decode(SML::encode($input_array));
$input_array == $output_array// true

/* objektorientierte Variante, gemischte Schreibweise */
$configFile = new ConfigFile("foo.config");
$configFile->read();
$array $configFile->get();

/* objektorientierte Variante, Schlüssel in Großbuchstaben */
$smlFile = new SML("foo.config");
$smlFile->read();
$array $smlFile->get();
?>

Navigieren innerhalb einer SML-Datei:

Angenommen die Datei "foo.config" hätte folgenden Inhalt:

<ROOT>
	<FOO1>
		<FOO2>text</FOO2>
		<FOO3>
			<0>1</0>
			<1>foo</1>
		</FOO3>
	</FOO1>
</ROOT>

<?php 
$mixed $smlFile->get("ROOT.FOO1");
print_r($mixed);
?>

Diese Abfrage liefert den Teilbaum ROOT.FOO1 mit FOO1 als Wurzelement.

Ausgabe:

array(
	"FOO2" => "text",
	"FOO3" => array (
		0 => 1,
		1 => "foo"
	)
)

Wie schreibe ich eine Variable in eine Config- oder SML-Datei?

Die Funktion SML::encode() erzeugt für die übergebene Variable eine Darstellung als SML-Code und liefert diesen als String zurück. Es muss sich entweder um eine Variable mit einem skalaren Wert oder ein Array handeln.

Bitte beachten Sie: die Funktion "SML::encode" erkennt keine unendlichen Rekursionen. Daher müssen die Datenfelder rekursionsfrei sein. Andernfalls wird durch den Compiler eine Fehlermeldung erzeugt.

Speichert die Einträge eines Array in der Datei "foo.config":

<?php 
$string SML::encode($array"ROOT");
file_put_contents("foo.sml"$string);
?>

Ersetzen Sie "ROOT" durch den Namen des Wurzelelements!

Benutzen von Großbuchstaben, Kleinbuchstaben und gemischter Schreibweise analog zu SML::decode():

<?php 
$string SML::encode($array"ROOT"CASE_UPPER); // groß
$string SML::encode($array"ROOT"CASE_LOWER); // klein 
$string SML::encode($array"ROOT"CASE_MIXED); // gemischt (default)
?>

objektorientierte Variante, gemischte Schreibweise:

<?php 
$configFile = new SML("foo.sml");
$configFile->read();
$configFile->create();
$configFile->insert($string);
$configFile->write();
?>

objektorientierte Variante, Schlüssel in Großbuchstaben:

<?php 
$smlFile = new SML("foo.sml"CASE_UPPER);
$smlFile->read();
$smlFile->create();
$smlFile->insert($string);
$smlFile->write();
?>

Wie kopiere ich eine Datei?

Zum Kopieren einer Datei besitzen alle YANA-Klassen, die Dateien repräsentieren, die Funktion "copy". Beim Kopieren der Datei können außerdem auch deren Zugriffsrechte gesetzt werden. Sollte das Verzeichnis, in welches die Datei kopiert werden soll, noch nicht existieren, kann es automatisch erzeugt werden. Letzteres ist optional.

Im Folgenden einige Beispiele.

eine Datei kopieren:

<?php 
$foo = new SecureFileStream("foo.txt");
$foo->copy("bar.txt");

$foo->copy("bar.txt"); // Fehlermeldung: Datei existiert bereits
?>

eine Datei kopieren und bereits existierende Dateien überschreiben:

<?php 
$foo->copy("bar.txt"true);

$foo->copy("bar/foo2.txt"); // Fehlermeldung: Verzeichnis 'bar' existiert nicht
?>

eine Datei kopieren und fehlende Verzeichnisse automatisch erzeugen:

<?php 
$foo->copy("bar/foo2.txt"falsetrue);

/* Das Verzeichnis 'bar/' wurde angelegt und die Datei 'foo2.txt' darin gespeichert.
   Die Zugriffsrechte für das Verzeichnis wurden per Default auf 766 gesetzt. */

/* das Verzeichnis wird nun wieder gelöscht */
$dir = new DirStream("bar");
$dir->delete(true);
?>

eine Datei kopieren und Zugriffsrechte für die kopierte Datei auf 655 setzen:

<?php 
$foo->copy("bar/foo2.txt"falsefalse655);

/* Das Verzeichnis 'bar/' wurde erneut angelegt.
   Die Zugriffsrechte für das Verzeichnis wurden nun auf 655 gesetzt - so wie für
   die Datei. */
?>

Autor: Thomas Meyer, www.yanaframework.net