/apuxin/vfs.php
PHP | 1468 lines | 627 code | 126 blank | 715 comment | 118 complexity | 4f1dea6186f93af00e72aa7710b7d5c6 MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1
- <?php
- /**
-
- ==============================
- VV VV FFFFFF SSSSSS
- VV VV FF SS
- VV VV FFFFF SSSSSS
- VVVV FF SS
- VV FF SSSSSS
- ===============================
-
- Virtual File System
-
-
- Name: VFS - Virtual File System
- Version: 0.4 Beta # 4
- Author: Markus Gutbrod
- Authormail: gutbrod.markus@googlemail.com
- Website: http://code.google.com/p/apuxin
- */
-
- function ddefine($name, $value)
- {
- if(!defined($name)) {
- define($name, $value);
- return true;
- }
- return false;
- }
-
- // "Verzeichnis-Teiler", z.B. / oder \
- ddefine("DS", DIRECTORY_SEPARATOR);
-
- // Definiere VFS-Version
- ddefine("VirtualFileSystem", "0.4 beta #4");
- // Wie hei?t die Einstellungsdatei?
- ddefine("VFS_SETTING", "settings.vfs.php");
- // Wie hei?t das Einstellungsverzeichnis
- ddefine("VFS_SETTINGS", "settings".DS);
- // Wie hei?t das Dateiverzeichnis
- ddefine("VFS_FILES", "files".DS);
- // Wie hei?t des ?ffentliche Verzeichnis?
- ddefine("VFS_PUBLIC", "public".DS);
- // Wie hei?t das Verzeichnis des Papierkorbs?
- ddefine("VFS_TRASH", "trash".DS);
- // Datenverzeichnis
- ddefine("VFS_DATA", "data".DS);
-
- // PluginVerzeichnis
- ddefine("VFS_PLUGINS", "vfs".DS."plugins".DS);
- // Das Zeichen, das VFS zeigt, dass eine Datei oder ein Ordner versteckt ist
- ddefine("HIDDENSIGN", "_");
-
- ddefine("BR", "\r\n");
-
- // Funktion zum einfachen einbinden von Dateien laden
- include_once( "vfs".DS."importer.php");
-
- // Der Zugriff von VFS (VirtualFileSystem) auf RFS(RealFileSystem)
- jimport("vfs.rfs");
- // Mathematische Funktionen
- jimport("math");
- // Optionen
- jimport("options");
- // Umrechnung von Dateigr??en
- jimport("vfs.filesize");
- // Errormeldungen
- jimport("vfs.errno");
- // Errorlogger
- jimport("vfs.errorlog");
-
- // Eigentliche Klasse
- class VirtualFileSystem
- {
- // Speichert den Pfad zum Dateisystem
- private $path;
- // Speichert den Pfad zum Verzeichnis eines Users
- private $upath;
- // Speicherung des Benutzernamens
- private $uname;
- // Boolean: eingeloggt (true) oder nicht eingeloggt (false)
- private $logged_in;
- // Das Dateiverzeichnis des eingeloggten Users
- public $fs;
- // Speichert Objekte, die f?r den Einsatz von VFS gebraucht werden
- private $handler;
- // Handler f?r Dateien
- private $files;
- // Soll VFS ohne Plugins geladen werden?
- private $safemod;
-
- // Verzeichnisstruktur (Fo9lderStructure)
- private $folderStructure;
-
- /**
- * Konstruktor
- * Initialisierung aller Variablen
- *
- * Argumente:
- * $path - Pfad zum Dateisystem
- */
- function __construct( $path, $safemod = false )
- {
- // Speichere den Pfad zum Dateisystem
- $this->path = dirname(__FILE__).DS.$path.DS;
- // Leere alle Variablen, beziehungsweise initialisiere sie
- $this->_clear();
- // soll safemod aktiviert werden?
- $this->safemod = $safemod;
- // Erstelle ein Objekt von Errorlogger, um eventuell auftretende Fehler speichern zu k?nnen
- $this->handler = array('log' => new ERRORLOGGER());
-
- $this->files = array();
- $this->folderStructure = array();
- }
-
- public function add2FolderStructure($stringOfFolder)
- {
- $this->folderStructure[] = $stringOfFolder;
- }
-
- /**
- * error
- * Speicherung von auftretenden Fehlern, beziehungsweise deren ?bergabe an das Objekt der Klasse "Errorlogger"
- *
- * Argumente:
- * $errno - Fehlernummer, siehe dazu die Datei vfs/errno.php
- * $detailed - eventuell weitere Informationen zum aufgetretenen Fehler
- */
- private function error( $errno, $detailed )
- {
- $this->handler['log']->add($errno, $detailed);
- }
-
- /**
- * _clear
- * Initialisieren/Leeren von (System-)Variablen
- */
- private function _clear()
- {
- // Pfad zum Benutzerverzeichnis
- $this->upath = "";
- // Benutzername
- $this->uname = "";
- // ist jemand eingeloggt?
- $this->logged_in = false;
- // Verzeichnisbaum
- $this->fs = false;
- }
-
- /**
- * loggedIn
- * Gibt zur?ck, ob schon ein Nutzer eingeloggt wurde
- *
- * R?ckgabewerte:
- * true - es ist bereits ein User eingeloggt
- * false - es ist noch kein Nutzer eingeloggt
- */
- public function loggedIn()
- {
- if(!$this->logged_in) {
- return false;
- }
- return true;
- }
-
- /**
- * login
- * Loggt einen Nutzer ein
- *
- * Argumente:
- * $username - Username eines Nutzers und ...
- * $passwd - ... das passende Passwort dazu
- *
- * R?ckgabewerte:
- * true - Der User wurde erfolgreich eingeloggt
- * false - Fehler beim Einloggen
- *
- * Errormeldungen:
- * 2019 - Es ist bereits ein User eingeloggt
- */
- public function login( $username, $passwd )
- {
- // Pr?fe, ob schon jemand eingeloggt ist
- if($this->loggedIn()) {
- $this->error(2019, "");
- return false;
- }
-
- // Bearbeite den Usernamen; Speicherung erfolgt immer nur in Kleinbuchstaben
- $username = strtolower($username);
- // Verschl?ssele das Passwort
- $passwd = $this->passwd($passwd);
-
- // Pfad zum User-Verzeichnis zusammenbauen
- $path = $this->path.$username.DS;
- // Pr?fung, ob der User existiert
- if(folder_exists($path)) {
- // Binde Usereinstellungen ein
- include_once($path.VFS_SETTING);
- // Pr?fe, ob das Passwort richtig ist
- if($passwd == $vfs_user_settings[$username]['passwd']) {
- // Speichere Userpfad
- $this->upath = $path;
- // Speichere Einstellungen
- $this->uname = $vfs_user_settings[$username]['username'];
- // Setze LoggedIn-Flag
- $this->logged_in = true;
- // F?r eine erh?hte Sicherheit werden die Einstellungen gel?scht, so dass sie nur in dieser Klasse weiter verwendet werden k?nnen
- unset($vfs_user_settings);
- return true;
- }
- // F?r eine erh?hte Sicherheit werden die Einstellungen gel?scht, da der User ein falsches Passwort eingegeben hat.
- unset($vfs_user_settings);
- }
- return false;
- }
-
- /**
- * Logout
- * Leerung aller Variablen -> kommt einem Logout gleich
- */
- public function logout()
- {
- $this->_clear();
- }
-
- /**
- * passwd
- * Verschl?sselt ein Passwort
- *
- * Argumente:
- * $passwd - Das Passwort, das Verschl?sselt werden soll
- *
- * R?ckgabewerte:
- * (md5) - Verschl?sseltes Passwort
- */
- private function passwd( $passwd )
- {
- return md5($passwd);
- }
-
- /**
- * userexist
- * Pr?ft, ob ein User existiert
- *
- * Argumente:
- * $username - Benutzername, der gepr?ft werden soll
- *
- * R?ckgabewerte:
- * true - User existiert
- * false - User existiert nicht
- */
- public function userexist( $username )
- {
- if(folder_exists($this->path.strtolower($username).DS)) {
- return true;
- }
- return false;
- }
-
- /**
- * useradd
- * Erstellt einen neuen Nutzer
- *
- * Argumente:
- * $username - Username und ...
- * $password - Passwort des zu erstellenden Users
- *
- * R?ckgabewerte:
- * true - Usereinrichtung erfolgreich
- * false - Fehler beim Einrichten des Users
- *
- * Errormeldungen:
- * 2021 - Verzeichnis f?r diesen User bereits vorhanden
- */
- public function useradd( $username, $password/*, $xml = array() */)
- {
- if(empty($username) || empty($password)) {
- return false;
- }
- // VFS nutzt nur klein-geschriebene Verzeichnisse
- $un = strtolower($username);
- if(folder_exists($this->path.$un.DS)) {
- $this->error(2021, $un);
- return false;
- }
- // Verschl?ssele Passwort
- $passwd = $this->passwd($password);
- $upath = $this->path.$un.DS;
- // Erstelle Verzeichnisstruktur
- mkdir($upath, 0777);
- // Arbeite Verzeichnisliste ab
- foreach($this->folderStructure as $fstruc) {
- mkdir($upath.$fstruc, 0777);
- }
-
- // Schreibe Einstellungsdatei
- $fp = fopen($upath.DS.VFS_SETTING, "w");
- if(!$fp) {
- // Fehler zur?ckgeben, falls sie nicht erstellt werden konnte
- return false;
- }
- fputs($fp, "<?php\n");
- fputs($fp, "\$vfs_user_settings['".$un."'] = array();\n");
- // Nutzername
- fputs($fp, "\$vfs_user_settings['".$un."']['username'] = \"".$username."\";\n");
- // Passwort
- fputs($fp, "\$vfs_user_settings['".$un."']['passwd'] = \"".$passwd."\";\n");
- fputs($fp, "?>");
- fclose($fp);
- return true;
- }
-
- /**
- * userdel
- * l?scht einen User
- *
- * Argumente:
- * $username - Name des Nutzers, der gel?scht werden soll
- *
- * R?ckgabewerte:
- * true - User erfolgreich gel?scht
- * false -
- *
- * Errormeldungen:
- * 2022 - Verzeichnis dieses User nicht vorhanden, vll wurde er schon gel?scht
- */
- public function userdel( $username )
- {
- $username = strtolower($username);
- // Pr?fe, ob User existiert
- if(!folder_exists($this->path.$username.DS)) {
- // Gebe Fehlermeldung zur?ck
- $this->error(2022, $username);
- return false;
- }
- // Ordner l?schen
- folder_remove($this->path.$username);
- return true;
- }
-
- /**
- * username
- * gibt den Usernamen des aktuell eingeloggten Benutzers zur?ck
- *
- * Argumente:
- * $path - Aktueller Pfad
- *
- * R?ckgabewerte:
- * (array) - Gesamter Verzeichnisinhalt (rekursiv)
- * false - User ist nicht eingeloggt, oder Verzeichnis existiert nicht
- */
- public function username( )
- {
- if(!$this->logged_in) {
- return false;
- }
- return $this->uname;
- }
-
- /**
- * _index
- * Hilfsfunktion, um alle Dateien zu indizieren
- *
- * Argumente:
- * $path - Aktueller Pfad
- *
- * R?ckgabewerte:
- * (array) - Gesamter Verzeichnisinhalt (rekursiv)
- * false - User ist nicht eingeloggt, oder Verzeichnis existiert nicht
- */
- private function _index( $path )
- {
- // Pr?fen, ob User eingeloggt ist
- if(!$this->logged_in) {
- return false;
- }
-
- // Wenn Verzeichnis nicht vorhanden, -> Fehlermeldung
- if(!folder_exists($path)) {
- return false;
- }
-
- // Variable f?r die Dateien/Ordner
- $arr = array();
-
- // Arbeite alle Ordner nacheinander ab
- foreach(createDirectoryList($path, true, "dir") as $dir) {
- // F?ge Ordner zur Dateiliste hinzu
- $arr[] = array(
- $dir, // Ordnername
- "dir", // Indikator f?r Ordner
- 0, // Gr??e des Ordners
- $path.$dir.DS, // Der Pfad zum Ordner
- "vfs", // Handler (wie der Ordner gehandhabt werden soll)
- $this->_index($path.$dir.DS), // Dateien/Ordner in diesem Ordner
- );
- }
-
- // Arbeite alle Dateien nacheinander ab
- foreach(createDirectoryList($path /*Pfad*/, true /*auch versteckte*/, "file" /*Dateien*/) as $file) {
- $arr[] = array(
- $file, // Dateiname
- "file", // Indikator f?r Datei
- filesize($path.DS.$file), // Dateigr??e
- $path.$file, // Pfad zur Datei
- "vfs", // Handler (wie die Datei ge?ffnet werden soll)
- array() // Reserviert f?r Dateien innerhalb der Datei (z.B. Archive)
- );
- }
-
- // Datei-/Ordnerliste zur?ckgeben
- return $arr;
- }
-
- /**
- * index
- * Funktion, die ein Verzeichnis ausliest und eventuell existierende Plugins einbezieht
- *
- * R?ckgabewerte:
- * false - Fehler beim Auslesen; User ist nicht eingeloggt
- *
- * Errormeldungen:
- * 2012 - Benutzer ist nicht eingeloggt
- */
- public function index( ) {
- // Pr?fe, ob Benutzer eingeloggt ist
- if(!$this->logged_in) {
- $this->error(2012, "");
- return false;
- }
-
- // Schreibe Verzeichnisstruktur in die Objektvariable $fs (FileSystem)
- $this->fs = $this->_index($this->upath);
-
- // Nur wenn der Safemod nicht aktiviert ist, sollen Plugins eingebunden werden
- if(!$this->safemod) {
- // Arbeite alle Dateien im Verzeichnis §Plugins§/dirreader ab
- foreach(createDirectoryList(VFS_PLUGINS."dirreader", false, "file") as $f) {
- // Streiche die Endung weg
- $f = crossOutFileType($f);
- // Importiere die Funktion
- jimport(VFS_PLUGINS."dirreader".DS.$f);
- // Erst pr?fen, ob die Funktion existiert
- if(function_exists($f)) {
- // Rufe die Funktion auf
- $this->fs = call_user_func($listener, $path, $this->fs);
- }
- }
- }
- }
-
- /**
- * isHidden
- * Pr?ft, ob eine Datei versteckt ist
- *
- * Argumente:
- * $filename - Dateiname, der zu ?berpr?fen ist
- *
- * R?ckgabewerte:
- * true - Datei soll versteckt werden
- * false - Datei soll nicht versteckt werden
- */
- private function isHidden( $filename )
- {
- if($filename[0] == HIDDENSIGN) {
- return true;
- }
- return false;
- }
-
- /**
- * browse
- * Gebe eine Datei-/Ordnerliste zu einem Verzeichnis aus
- *
- * Argumente:
- * $path - Pfad zum Ordner
- * $options - Optionen
- * showHiddenElements (Standard: false) - Sollen versteckte Elemente angezeigt werden?
- * showFiles (Standard: true) - Sollen Dateien angezeigt werden?
- * showFolders (Standard: true) - Sollen Ordner angezeigt werden?
- * urgeInFolder (Standard: VFS_FILES) - In welchen Ordner soll die Funktion eingesperrt werden?
- *
- * R?ckgabewerte:
- * (array) - Dateiliste
- * false - User nicht eingeloggt
- *
- * Errormeldungen:
- * 2013 - User nicht eingeloggt
- */
- public function browse( $path, $options = array() )
- {
- if(!$this->logged_in) {
- $this->error(2013, "");
- return false;
- }
-
- // Definiere Standardoptionen
- $standardOptions = array(
- 'showHiddenElements' => false,
- 'showFiles' => true,
- 'showFolders' => true,
- 'urgeInFolder' => VFS_FILES
- );
- // Kombiniere Standard- und aktuelle Optionen
- $options = setOptions($standardOptions, $options);
- //print_r($options);exit;
- $fs = $this->_browse( $path, 0, $options );
- //print_r($fs);exit;
- if(!$fs) { $this->error(2023, $path); return false; }
-
- $list = array();
- foreach($fs as $ft) {
- if(!$options['showHiddenElements'] && $this->isHidden($ft[0])) {
- continue;
- }
- if(!$options['showFiles'] && $ft[1] == "file") {continue;}
- if(!$options['showFolders'] && $ft[1] == "dir") {continue;}
- $list[] = $ft[0];
- }
- return $list;
- }
-
- /**
- * _browse
- * Hilfsfunktion f?r browse
- *
- * Argumente:
- * $path - Pfad zum auszulesenden Verzeichnis
- * $mode - Welcher Modus?
- * 0 - Array von Dateien in diesem Ordner
- * 1 - Gibt den Pfad zur?ck. Dabei wird auch falsche Gro?-/Kleinschreibung korrigiert
- * 2 - Gibt ein Array des ganzen Ordners zur?ck (inkl. Gr??e, Handler, Pfad, Unterdateien/-ordner, ...)
- * $options - Optionen
- * urgeInFolder (Standard: VFS_FILES) - Soll die Funktion in einen Ordner eigesperrt werden
- *
- * R?ckgabewerte:
- * (array) - Verzeichnisbaum
- * false - nicht eingeloggt, oder Verzeichnis existiert nicht
- */
- private function _browse( $path, $mode = 0, $options = array() )
- {
- // Definiere Standardoptionen
- $standardOptions = array(
- 'urgeInFolder' => VFS_FILES,
- 'abortOnError' => true
- );
- // Kombiniere Standard- und aktuelle Optionen
- $options = setOptions($standardOptions, $options);
- $options['urgeInFolder'] = $this->_preparePath($options['urgeInFolder']);
-
- // Pr?fe, ob User eingelogt ist
- if(!$this->logged_in) {
- return false;
- }
- // Falls noch nichts ausgelesen wurde, dann rufe die Indexierungsfunktion auf
- if(!$this->fs) {
- $this->index();
- }
-
- // Aus Gr?nden der Kompatibilit?t
- if($mode === true) {
- $mode = 1;
- }
-
- // Pfad vorbereiten: Doppelte Slashes entfernen, Root-Zeichen weg
- $path = $this->_preparePath($path);
- //print_r($path);exit;
- $fs = array();
- //echo "<h2>browse</h2>";
- // Dateisystem laden
- if($options['urgeInFolder'] == DS) {
- //echo "whole";
- $fs = $this->fs;
- } else {
- //echo "part";
- $fs = $this->_browse($options['urgeInFolder'], 0, array('urgeInFolder' => DS));
- }
-
- // Root zur?ckgeben?
- if($path == DS) {
- // Root-Pfad zur?ckgeben
- if($mode == 1) {
- return DS;
- }
- if($mode == 2) {
- return array("root", "dir", 0, $this->upath.$options['urgeInFolder'].DS, "vfs", $fs);
- }
- // Das gesamte Dateisystem zur?ckgeben
- return $fs;
- }
- //echo "<h2>browse</h2>";
- //echo $path;
- // Pfad zerteilen, um jedes Verzeichnis einzeln abzuarbeiten
- $p = explode(DS, $path);
-
- // ?nderungen, die vorgenommen werden, in $changes speichern, um .. (Verzeichnis aufw?rts) auswerten zu k?nnen
- $changes = array($fs);
- // Pfad-Array, entspricht $p, nur neu zusammengesetzt
- $paths = array();
- //$lastNumber = 0;
-
- // Arbeite einzelne Ordner ab
- foreach($p as $q) {
- // Werte . (akutelles Verzeichnis aus: einfach fortfahren)
- if($q == ".") {
- continue;
- }
-
- // Wenn .. (Verzeichnis aufw?rts)
- if($q == "..") {
- // Letztes Verzeichnis wiederherstellen
- $t = count($changes)-2;
- if($t < 0) {$t = 0;} else {array_pop($changes);}
- $fs = $changes[$t];
- // Letztes Verzeichnis aus dem Verzeichnis-Array entfernen
- array_pop($paths);
- // Schleife neu starten-
- continue;
- }
-
- // Variable, um zu ?berpr?fen, ob ein Verzeichnis gefunden wurde
- $changed = false;
- // Suche Ordner im aktuellen Verzeichnis
- foreach($fs as $n=>$ft) {
- // Wenn das der gesuchte Ordner ist, dann:
- if(strtolower($ft[0]) == strtolower($q) && $ft[1] == "dir") {
- // Variable $fs neu beschreiben (mit dem Inhalt des aktuellen Verzeichnisses)
- $fs = $ft[5];
- // Speichere das aktuelle Verzeichnis in $changes, um .. (Verzeichnis aufw?rts) zu erm?glichen
- $changes[] = $fs;
- // Ordner gefunden -> in $paths hinzuf?gen
- $paths[] = $q;
- // Das Verzeichnis wurde gefunden
- $changed = true;
- // Schleife abbrechen, da das Verzeichnis gefunden wurde
- break;
- }
- }
- if(!$changed && $options['abortOnError']) {
- //echo "Verzeichnis nicht gefunden";
- return false;
- }
- }
- if($mode == 1) {
- return implode(DS, $paths);
- } else if($mode == 2) {
- $t = count($changes)-2;
- return array("root", "dir", 0, $this->upath.$options['urgeInFolder'].DS, "vfs", $changes[0]);
- return $changes[$t];
- }
- //print_r($fs);
- return $fs;
- }
-
- /**
- * sizeOfFolder
- * Ermittelt die Gr??e eines Ordners
- *
- * Argumente:
- * $path - Der Ordner, dessen Gr??e ermittelt werden soll
- * $options - Optionen
- * countHiddenElements (Standard: false) - Sollen versteckte Elemente mitgez?hlt werden?
- * countFolders (Standard: true) - Sollen Ordner mitgez?hlt werden?
- * countFiles (Standard: true) - Sollen Dateien mitgez?hlt werden?
- * urgeInFolder (Standard: VFS_FILES) - Soll die Abfrage in ein bestimmtes Verzeichnis gezw?ngt werden?
- *
- * R?ckgabewerte:
- * (int) - Gr??e des Ordners
- * false - User ist nicht eingeloggt
- *
- * Errormeldungen:
- * 2014 - User ist nicht eingeloggt
- * 2024 - Verzeichnis existiert nicht
- */
- public function sizeOfFolder( $path, $options = array() )
- {
- // Erst pr?fen, ob irgendjemand eingeloggt ist
- if(!$this->logged_in) {
- $this->error(2014, "");
- return false;
- }
-
- $standardOptions = array(
- 'countHiddenElements' => false,
- 'countFolders' => true,
- 'countFiles' => true,
- 'urgeInFolder' => VFS_FILES
- );
- $options = setOptions($standardOptions, $options);
-
- // Verzeichnisinhalt in die Variable $fs schreiben
- $fs = $this->_browse( $path, 0, array('urgeInFolder' => $options['urgeInFolder']) );
-
- // Wenn dabei ein Fehler aufgetreten ist, dann Fehlermeldung zur?ckgeben
- if(!$fs) { $this->error(2024, $path); return false; }
-
- // Dateigr??e: 0 Byte
- $size = 0;
- // Alle Dateien und Ordner in dem Verzeichnis abarbeiten
- foreach($fs as $ft) {
- // Wenn versteckte Ordner/Dateien nicht angezeigt werden sollen, dann einfach mit der Schleife weitermachen
- if(!$options['countHiddenElements'] && $this->isHidden($ft[0])) {continue;}
-
- // Wenn dies ein Verzeichnis ist, dann ...
- if($ft[1] == "dir" && $options['countFolders']) {
- // ... ruft sich diese Funktion mit dem neuen Ordner selbst auf
- $size += $this->sizeofFolder($path.DS.$ft[0]);
- // ansonsten ist es eine Datei und ...
- } else if($ft[1] == "file" && $options['countFiles']) {
- // die Dateigr??e wird dazugez?hlt
- $size += $ft[2];
- }
- }
-
- // Gr??e zur?ckgeben
- return $size;
- }
-
- /**
- * sizeOfFile
- * Ermittelt die Gr??e einer Datei
- *
- * Argumente:
- * $path - Die Datei, deren Gr??e ermittelt werden soll
- * $options - Optionen
- * urgeInFolder (Standard: VFS_FILES) - Soll die Abfrage in ein bestimmtes Verzeichnis gezw?ngt werden?
- *
- * R?ckgabewerte:
- * (int) - Gr??e der Datei
- * false - User ist nicht eingeloggt
- * - Datei existiert nicht
- *
- * Errormeldungen:
- * 2014 - User ist nicht eingeloggt
- * 2024 - Datei existiert nicht
- */
- public function sizeOfFile( $path, $options = array() )
- {
- // Erst pr?fen, ob irgendjemand eingeloggt ist
- if(!$this->logged_in) {
- $this->error(2014, "");
- return false;
- }
-
- // Optionsverarbeitung
- $standardOptions = array(
- 'urgeInFolder' => VFS_FILES
- );
- $options = setOptions($standardOptions, $options);
-
- // Verzeichnisinhalt in die Variable $fs schreiben
- $fs = $this->_searchFor(dirname($path), basename($path), $options);
-
- // Wenn dabei ein Fehler aufgetreten ist, dann Fehlermeldung zur?ckgeben
- if(!$fs) { $this->error(2024, $path); return false; }
-
- // Gr??e zur?ckgeben
- return $fs[2];
- }
-
- /**
- * _preparePath
- * Bereitet einen Pfad auf die weitere Verarbeitung vor
- *
- * Argumente:
- * $path - Der Pfad, der Verarbeitet werden soll
- *
- * R?ckgabewerte:
- * (string) - Der (optimierte) Pfad
- */
- private function _preparePath( $path )
- {
- //die($path);
- $path = str_replace(array("\\", "/"), array(DS, DS), $path);
- //echo "<h1>preparePath</h1>";
- if(empty($path)) {return DS;}
- // Root-Slash entfernen
- while($path[0] == DS) {
- $path = substr($path, 1, strlen($path));
- }
- while($path[strlen($path)-1] == DS) {
- $path = substr($path, 0, strlen($path)-1);
- }
- // Wenn der Pfad leer ist, dann gebe Root-Slash zur?ck
- if(empty($path) || $path == ".") {
- return DS;
- }
- // Ansonsten gebe den bearbeiteten Pfad zur?ck
- return $path;
- }
-
- /**
- * _searchFor
- * Sucht in einem Verzeichnis nach einer bestimmten Datei
- *
- * Argumente:
- * $path - Das Verzeichnis, in dem gesucht werden soll
- * $filename - Die Datei, die gesucht werden soll
- * $options - Optionen
- * urgeInFolder (Standard: VFS_FILES) - Soll die Abfrage in ein bestimmtes Verzeichnis gezw?ngt werden?
- *
- * R?ckgabewerte:
- * (array) - Informationen ?ber die Datei
- * false - ein Fehler ist aufgetreten
- */
- /*private function _searchFor( $path, $filename = "", $options = array() )
- {
- //echo "<h1>searchfor</h1>$path<br>$filename<br>";
- if(empty($path) && empty($filename)) {
- return false;
- } else if(empty($path)) {
- $path = DS;
- }
- $path = $this->getPath($path);
- if(!$path) {return false;}
- if(empty($filename) && $path == DS) {
- return false;
- } else if(empty($filename)) {
- $filename = basename($path);
- $path = dirname($path);
- }
- $fs = $this->_browse($path, 0, $options);
- if(!$fs) {return false;}
- //print_r($fs);
- foreach($fs as $ft) {
- if(strtolower($filename) == strtolower($ft[0])) {
- return $ft;
- }
- }
- return false;
- }*/
-
- private function _searchFor( $path, $filename, $options = array() )
- {
- $path = $this->_preparePath($path);
- if(empty($filename)) {return false;}
-
- $fs = $this->_browse($path, 0, $options);
- if(!$fs) {return false;}
- foreach($fs as $ft) {
- if(strtolower($filename) == strtolower($ft[0])) {
- return $ft;
- }
- }
- return false;
- }
-
- public function getPath( $path, $options = array() )
- {
- return $this->_browse($path, 1, $options);
- }
-
- public function exists( $path )
- {
- if($this->file_exists($path) || $this->folder_exists($path)) {
- return true;
- }
- return false;
- }
-
- public function file_exists( $path, $options = array() )
- {
- $fs = $this->_searchFor(dirname($path), basename($path), $options);
- if(!$fs) {
- return false;
- }
- if($fs[1] == "file") {
- return true;
- }
- return false;
- }
-
- /*public function folder_exists( $path )
- {
- $fs=$this->_searchFor(dirname($path), basename($path));
- if(!$fs) {
- return false;
- }
- if($fs[1] == "dir") {
- return true;
- }
- return false;
- }*/
-
- public function folder_exists( $path, $options = array() )
- {
- //echo "path:".$path.";";
- $pat = explode(DS, $path = $this->_preparePath($path));
- $fs = $this->_searchFor($path.DS."..", $pat[count($pat)-1], $options);
- if(!$fs) {return false;}
- if($fs[1]=="dir") {return true;}
- return false;
- }
-
- public function is_file( $path )
- {
- return $this->file_exists($path);
- }
-
- public function is_dir( $path )
- {
- return $this->folder_exists($path);
- }
-
-
- /*
- // Einstellungen rausgek?rzt, da es daf?r einen eigenen Service geben wird
-
- public function set( $group, $name, $value )
- {
- $group = strtolower($group);
- $name = strtolower($group);
- $this->handler['settings'][md5($group)]['file'] = $group;
- $this->handler['settings'][md5($group)]['values'][$name] = $value;
- $this->handler['settings'][md5($group)]['changed'] = true;
- }
-
- private function _get( $group, $name )
- {
- rewind($this->handler['settings'][$group]['pointer']);
- while($line = fgetcsv($this->handler['settings'][$group]['pointer'], 10000, ";", "\"")) {
- $n = strtolower($line[0]);
- $v = $line[1];
-
- if(isset($this->handler['settings'][$group]['values'][$n])) {
- continue;
- }
- $this->handler['settings'][$group]['values'][$n] = $v;
- }
- $this->handler['settings'][$group]['read'] = true;
- }
-
- public function get( $group, $name )
- {
- $group = strtolower($group);
- $mdg = md5($group);
- $name = strtolower($name);
- if(isset($this->handler['settings'][$mdg]['values'][$name])) {
- return $this->handler['settings'][$mdg]['values'][$name];
- }
- if(!isset($this->handler['settings'][md5($group)]['pointer'])) {
- $this->handler['settings'][md5($group)]['pointer'] = fopen($this->upath.VFS_SETTINGS.$group, "w+");
- }
-
- $this->_get( $mdg, $name );
-
- if(isset($this->handler['settings'][md5($group)]['values'][$name])) {
- return $this->handler['settings'][md5($group)]['values'][$name];
- }
- return false;
- }
- */
-
- /** private function _getHandler( $res )
- {
- /*echo "<h1>_getHandler</h1>";
- print_r($this->files);
- echo "<br>".$res;
- if(!isset($this->files[$res])) {
- return false;
- }
- return $this->files[$res]['handler'];
- }
-
- private function _getPointer( $res )
- {
- if(!isset($this->files[$res])) {
- return false;
- }
- return $this->files[$res]['pointer'];
- }*/
-
- /**
- * _callPluginFuncByRes
- * Hilfsfunktion zum Aufruf einer Handler-Funktion
- *
- * Argumente:
- * $res - Resource zur Datei
- * $type - Typ, der ausgef?hrt werden soll (create, open, write, read, close, ...)
- * $extension - Argumente, die der aufzurufenden Funktion ?bergeben werden sollen
- *
- * R?ckgabewerte:
- * (array) - Ergebnis des Funktionsaufrufs
- * false - ein Fehler ist aufgetreten
- */
- /** private function _callPluginFuncByRes( $res, $type, $extension = "" )
- {
- // Hole den Handler der Resource und wenn ...
- if(!$handler = $this->_getHandler($res)) {
- // ... die Resource nicht verf?gbar ist, bzw. wenn ein Fehler aufgetreten ist,
- // gebe Fehlermeldung aus
- return false;
- }
-
- // Hole den "Pointer", der auf die Datei zeigt
- $pointer = $this->_getPointer( $res );
- //debug: echo $pointer;
-
- // Baue den Funktionsnamen zusammen
- $func = "vfs_plugin_".$handler."_".$type;
-
- // Wenn die Funktion mit dem oben zusammengebauten Namen nicht existiert, ...
- if(!function_exists($func)) {
- // ... versuche die Datei mit dem enthaltenden Handler einzubinden
- $p = VFS_PLUGINS."fs_".$handler.".php";
- // Falls diese jedoch nicht existiert: Fehler
- if(!file_exists($p)) {return false;}
- // Einbinden der Handlerdatei
- jimport($p, true);
- // Wenn es die Funktion immer noch nicht gibt: Fehler
- if(!function_exists($func)) {/*echo "fehler:".$func."<br>";return false;}
- }
-
- // Rufe die Funktion auf und speichere das Ergebnis (Standardergebnis ist die Aktualiesierung des Pointers)
- $return = call_user_func($func, $this->files[$res]['pointer'], $extension);
-
- // Standard-R?ckgabewert: true
- $r = true;
- // Wenn der von der Funktion zur?ckgegebene Wert ein Array ist, dann gibt es neben dem Pointer noch ein
- // "richtiges Ergebnis"
- if(is_array($return)) {
- // Das "richtige" Ergebnis
- $r = $return['return'];
- // Der Pointer
- $return = $return['pointer'];
- }
- // Aktualisiere den Pointer in VFS
- $this->files[$res]['pointer'] = $return;
-
- // Gebe das "richtige" Ergebnis, bzw. den Standardwert "true" zur?ck
- return $r;
- }
- */
-
- public function getHandler($res)
- {
- if(!isset($this->files[$res])) {
- return false;
- }
- return $this->files[$res]['handler'];
- }
-
- private function _callFSFunc( $res, $subFunc, $options = array() )
- {
- if(!$handler = $this->getHandler($res)) {return false;}
- $funcName = 'vfs_plugin_'.$handler."_".$subFunc;
- //echo $funcName;
-
- if(!function_exists($funcName)) {
- if(!file_exists(VFS_PLUGINS."fs_".$handler.".php")) {
- return false;
- }
- jimport(VFS_PLUGINS."fs_".$handler.".php", true);
- if(!function_exists($funcName)) {
- return false;
- }
- }
-
- $return = call_user_func($funcName, $this->files[$res]['pointer'], $options);
- $this->files[$res]['pointer'] = $return;
- if(isset($return['pointer'])) {
- $this->files[$res]['pointer'] = $return['pointer'];
- }
- if(isset($return['return'])) {
- $return = $return['return'];
- } else {
- $return = true;
- }
- return $return;
- }
-
- public function create( $pathToFile, $options = array() )
- {
- // Optionsbearbeitung
- $standardOptions = array(
- 'urgeInFolder' => VFS_FILES
- );
- $options = setOptions($standardOptions, $options);
-
- // Wenn Datei existiert: Fehlermeldung
- if($this->file_exists($pathToFile, $options)) { return false; }
-
-
- $fs = $this->_browse(dirname($pathToFile), 2, $options);
- if(!$fs) {return false;}
- $handler = $fs[4];
- $pathToFile = $fs[3].$pathToFile;
- $res = md5(low($pathToFile));
- $this->files[$res] = array('pointer' => $pathToFile, 'file' => $pathToFile, 'handler' => $handler);
- $this->_callFSFunc($res, 'create');
- return $res;
- }
-
- /**
- public function create($file, $vfssettings = false )
- {
- $dirname = dirname($file);
- $filename = basename($file);
- $res = md5(strtolower($file));
-
- if(isset($this->files[$res])) {
- return false;
- }
-
- if(!$vfssettings && $this->file_exists($file)) {
- return false;
- } else if (!$vfssettings) {
- $fs = $this->_browse($dirname.DS."..", 2);
- }
-
- return $res;
- }
- */
-
- public function mkdir ( $createFolder, $options = array() )
- {
- /** wird schon von $this->_browse ?bernommen
- // Optionsbearbeitung
- $standardOptions = array(
- 'urgeInFolder' => VFS_FILES
- );
- $options = setOptions($standardOptions, $options); */
- /** $options2 = $options;
- $options2['abortOnError'] = false;*/
-
- $dir = $this->_preparePath($createFolder);
- $dir = explode(DS, $dir);
- $dn = array_pop($dir);
- $dir = implode(DS, $dir);
-
- //echo "dir:".$dir."<br/>dn:".$dn."<br/>";
-
- if(empty($dn)) {return false;}
-
- if($this->folder_exists($createFolder, $options)) {return false;}
-
- $fs = $this->_browse($dir, 2, $options);
- if(!$fs) {return false;}
- $handler = $fs[4];
- $pathToFile = $fs[3].$createFolder;
- $res = md5($pathToFile);
- $this->files[$res] = array('pointer' => $pathToFile, 'file' => $pathToFile, 'handler' => $handler);
- return $this->_callFSFunc($res, 'mkdir');
- }
-
- public function open( $pathToFile, $options = array() )
- {
- // Optionsbearbeitung
- $standardOptions = array(
- 'urgeInFolder' => VFS_FILES,
- 'createFile' => false
- );
- $options = setOptions($standardOptions, $options);
-
- // Wenn Datei existiert: Fehlermeldung
- if(!$this->file_exists($pathToFile, $options)) {
- if($options['createFile']) {
- return $this->create($pathToFile, $options);
- }
- return false;
- }
-
-
- $fs = $this->_searchFor(dirname($pathToFile), basename($pathToFile), $options);
- if(!$fs) {return false;}
- $handler = $fs[4];
- $pathToFile = $fs[3];
- $res = md5(low($pathToFile));
- $this->files[$res] = array('pointer' => $pathToFile, 'file' => $pathToFile, 'handler' => $handler);
- $this->_callFSFunc($res, 'open');
- return $res;
- }
-
- /* public function open( $file, $vfssettings = false )
- {
- $dirname = dirname($file);
- $filename = basename($file);
- $res = md5(strtolower($file));
-
- if(isset($this->files[$res])) {
- return false;
- }
-
- if($file[0] != "/") {
- $file = "/".$file;
- }
-
- if(!$vfssettings && $this->file_exists($file)) {
- $fs = $this->_searchFor(dirname($file), basename($file));
- //print_r($fs);
- $handler = $fs[4];
- //echo $handler;
- $f = $fs[3];
- $this->files[$res] = array('file'=>$file, 'handler'=>$handler, 'pointer'=>$f);
- //echo "bis hierher l?ufts";
- if(!$this->_callPluginFuncByRes($res, "open")) {
- //echo "fehler beim Funktionsaufruf von _callPluginFuncByRes(".$res.")";
- unset($this->files[$res]);
- return false;
- }
- } else if(!$vfssettings) {
- return false;
- }
-
- if($vfssettings && file_exists($this->upath.VFS_SETTINGS.$file)) {
- jimport(VFS_PLUGINS."open/vfs.opener.php");
- $f = explode(":", $file);
- $f = $this->upath.VFS_SETTINGS.$f[1];
- $this->files[$res] = array('file'=>$f, 'handler'=>"vfs", 'pointer'=>$f);
- $this->_callPluginFuncByRes($res, "open");
- } else if($vfssettings) {
- return false;
- }
-
- //print_r($this->files);
-
- return $res;
- } */
- /*
- public function read( $res )
- {
- if(!$this->_getHandler($res)) {
- return false;
- }
- return $this->_callPluginFuncByRes($res, "read");
- }*/
-
- public function get( $file, $options = array() )
- {
- return $this->getContents( $file, $options );
- }
-
- public function getContents( $file, $options = array() )
- {
- // Definiere Standardoptionen
- $standardOptions = array(
- 'glue' => ""
- );
- // Kombiniere Standard- und aktuelle Optionen
- $options = setOptions($standardOptions, $options);
- if(!$res = $this->open($file, $options)) {
- return false;
- }
- $output = $this->readAll($res, 0, $options['glue']);
- $this->close($res);
- return $output;
- }
-
- /*public function put( $file, $string, $options = array() )
- {
- return $this->putContents($file, $string, $options);
- }*/
-
- public function putContents( $file, $string, $options = array() )
- {
- if(!$res = $this->open($file, $options)) {
- return false;
- }
- $this->write($res, $string);
- $this->close($res);
- return true;
- }
-
- public function append( $file, $output, $options = array() )
- {
- if(!$res = $this->open($file, $options)) {return false;}
- $this->seek($res);
- $this->nl($res);
- $this->write($res, $output);
- $this->close($res);
- }
-
- public function seek( $res )
- {
- return $this->_callFSFunc($res, "seek");
- }
-
- public function nl( $res )
- {
- return $this->_callFSFunc($res, "nl");
- }
-
- public function write( $res, $string )
- {
- return $this->_callFSFunc($res, "write", $string);
- }
-
- public function overwrite( $res, $string )
- {
- if(!$this->getHandler($res)) {return false;}
- $this->rewind($res);
- $this->truncate($res);
- $this->write($res, $string);
- }
-
- public function read( $res, $length = 0 )
- {
- return $this->_callFSFunc($res, "read", $length);
- }
-
- public function readAll( $res, $length = 0, $glue = "\n" )
- {
- $lines = array();
- while($lines[] = $this->read($res, $length)) {
- }
- if(count($lines)==0) {return false;}
- if(empty($glue)) {return $lines;}
- return implode($glue, $lines);
- }
-
- public function rewind( $res )
- {
- return $this->_callFSFunc($res, "rewind");
- }
-
- public function truncate( $res )
- {
- return $this->_callFSFunc($res, "truncate");
- }
-
- public function delete( $pathToFile, $options = array() )
- {
- if(!$this->file_exists($pathToFile, $options)) {
- return false;
- }
-
- $fs = $this->_searchFor(dirname($pathToFile), basename($pathToFile), $options);
- if(!$fs) {return false;}
- $handler = $fs[4];
- $pathToFile = $fs[3];
- $res = md5(low($pathToFile));
- if(isset($this->files[$res])) {
- return false;
- }
- $this->files[$res] = array('pointer' => $pathToFile, 'file' => $pathToFile, 'handler' => $handler);
-
- return $this->_callFSFunc($res, "delete");
- }
-
- public function rmdir( $pathToFile, $options )
- {
- if(!$this->folder_exists($pathToFile, $options)) {
- return false;
- }
-
- $fs = $this->_searchFor(dirname($pathToFile), basename($pathToFile), $options);
- if(!$fs) {return false;}
- $handler = $fs[4];
- $pathToFile = $fs[3];
- $res = md5(low($pathToFile));
- if(isset($this->files[$res])) {
- return false;
- }
- $this->files[$res] = array('pointer' => $pathToFile, 'file' => $pathToFile, 'handler' => $handler);
- }
-
- public function close( $res )
- {
- $ret = $this->_callFSFunc($res, "close");
- if(isset($this->files[$res])) {unset($this->files[$res]);}
- return $ret;
- }
-
- private function _each( $folder, $options = array() )
- {
- // Definiere Standardoptionen
- $standardOptions = array(
- 'execFunc' => "nothing",
- 'execFuncFile' => "nothing",
- 'execFuncFolder' => "nothing"
- );
- // Kombiniere Standard- und aktuelle Optionen
- $options = setOptions($standardOptions, $options);
- }
-
- /*
- public function write( $res, $string )
- {
- if(!$this->_getHandler($res)) {
- return false;
- }
- $this->_callPluginFuncByRes($res, "write", $string);
- return true;
- }*/
-
- /** public function rewind( $res )
- {
- if(!$this->_getHandler($res)) {
- return false;
- }
- $this->_callPluginFuncByRes($res, "rewind");
- return true;
- }*/
-
-
- /** public function close( $res )
- {
- if(!$this->_getHandler($res)) {
- return false;
- }
- $this->_callPluginFuncByRes($res, "close");
- unset($this->files[$res]);
- return true;
- }*/
-
- public function rename( $old, $new )
- {
- }
- }
-
- echo "<h1>VFS</h1>";
-
- $vfs = new VirtualFileSystem("filesystem");
- //echo ($vfs->loggedIn()) ? "true" : "false"; // gibt false zur?ck -> kein User ist eingeloggt
- $vfs->login("markus", "gutbrod");
- //echo ($vfs->loggedIn()) ? "true" : "false"; // gibt true zur?ck, falls die Anmeldung erfolgreich war, sonst false
- //$vfs = new VirtualFileSystem("filesystem");
- $vfs->add2FolderStructure(VFS_FILES);
- $vfs->add2FolderStructure(VFS_PUBLIC);
- $vfs->add2FolderStructure(VFS_TRASH);
- $vfs->add2FolderStructure(VFS_SETTINGS);
- $vfs->add2FolderStructure(VFS_DATA);
- print_r($vfs->browse(DS));
-
-
- //$vfs->useradd("markus", "gutbrod");
-
- //$vfs->login("markus", "gutbrod");
- //$vfs->index();
- //$vfs->delete("hallo.txt");
- //print_r($vfs->fs);
- //print_r($vfs->browse(DS));
- //echo $vfs->sizeOfFolder(DS, array('countHiddenElements' => false));
- //echo $vfs->sizeOfFile("vfs.php")+$vfs->sizeOfFile("options.php");
- /*if($vfs->file_exists("vfs.php")) {
- echo "JA";
- } else {
- echo "NEEEEIIIN";
- }*/
- /*if($vfs->folder_exists("test")) {
- echo "JA";
- } else {
- echo "NEEEEIIIN";
- }*/
- //echo $vfs->getContents("hallo.txt", array('glue'=>"<br>"));
- //$res = $vfs->open("hallo.txt");
- //$vfs->append("hallo.txt", "NOch eine Zeile. Wo kommt die denn her???");
- //$vfs->seek($res);
- //$vfs->nl($res);
- //$vfs->write($res, "hallo, ich bin schon wieder eine Zeile");
- //$vfs->truncate($res);
- //$vfs->write($res, array("testet die Write-Funktion", "jetzt aber mit 2 Zeilen"));
- //$vfs->close($res);
- //echo $vfs->read($res);
- /*echo $vfs->readAll($res, 0, "<br>");
- echo $vfs->readAll($res, 0, "<br>");
- $vfs->rewind($res);
- echo $vfs->readAll($res, 0, "<br>");*/
-
-
- //$vfs->mkdir("test");
- //if($vfs->put("test.txt", "hallo", array('createFile'=>true))) {echo "ja";}
- //$vfs->put("test.txt", "Ein ganz langer Text, der zeigt was da so abgeht");
- //echo $vfs->get("test.txt");
- //$vfs->append("test.txt", "Ein weiterer text");
- ?>