Bitte warten...

PHP: Ordner und Dateien

Bei allen folgenden Funktionen ist zu beachten, ob für die angegebenen Pfade die notwendigen Lese- bzw. Schreibrechte bestehen! Siehe auch die Informationen über Pfade in PHP.

Ordner und Dateien erzeugen

► PHP-Dokumentation: mkdir() touch()

Ordner können mit der Funktion mkdir() erzeugt werden. Als zweites Argument kann eine Oktalzahl für die Zugriffsrechte angegeben werden, ansonsten wird 0755 (rwxr-xr-x) angenommen. Ist das dritte Argument true, werden alle nicht vorhandenen Ordner bis zum Zielordner erzeugt, ansonsten wird ein Fehler gemeldet, wenn einer dieser Ordner nicht existiert.

Dateien ohne Inhalt können mit der Funktion touch() erzeugt werden. Alle übergeordneten Ordner im angegebenen Pfad müssen dazu existieren und werden nicht automatisch erzeugt. Ist die Datei noch nicht vorhanden, wird die Datei mit den Zugriffsrechten 0644 (rw-r--r--) erzeugt.

Code kopieren
  $dir = "scripts";
  mkdir($dir);

  $dir = "scripts/test";
  mkdir($dir, 0777, false);

  $file = "scripts/test/data.txt";
  touch($file);

Ordner und Dateien kopieren, umbenennen und verschieben

► PHP-Dokumentation: copy() rename()

Mit der Funktion copy() lässt sich eine Kopie eines Ordners oder einer Datei erzeugen. Mit der Funktion rename() kann ein Ordner oder eine Datei umbenannt und/oder verschoben werden. Der Zielordner muss beim Kopieren oder Verschieben bereits existieren. Bereits existierende Ordner oder Dateien gleichen Namens werden beim Kopieren, Umbenennen oder Verschieben kommentarlos überschrieben.

Code kopieren
  $file = "scripts/test/data.txt";
  copy($file, "scripts/test/data_kopie.txt");
  rename("scripts/test/data_kopie.txt", "scripts/test/data2.txt");  # benennt die Datei um
  rename("scripts/test/data2.txt", "scripts/data/data2.txt");  # verschiebt die Datei

Symbolische Verknüpfungen

► PHP-Dokumentation: symlink() readlink()

Symbolische Verknüpfungen (Symlinks) können mit der Funktion symlink() angelegt werden. Als Argumente müssen der Ort, auf den die Verknüpfung verweisen soll, sowie ihr eigener Pfad mit Dateiname angegeben werden. Am gleichtem Ort darf nicht bereits ein Symlink vorhanden sein. Es wird nicht geprüft, ob die verknüpfte Datei überhaupt existiert. Da sich der Ort, von dem aus der Symlink erstellt wird, und der, von dem aus er aufgerufen wird, unterscheiden können, sollten hier nur absolute Pfade für den Ort der verknüpften Datei angegeben werden.

Mit der Funktion readlink() kann das Verknüpfungsziel eines Symlinks abgefragt werden.

Code kopieren
  $symlink = "scripts/inc/e.php";
  if (is_link($symlink)) unlink($symlink);
  symlink(realpath("scripts/extra.php"), $symlink);
  echo readlink($symlink)."<br>";

Eigenschaften von Ordnern und Dateien auslesen

► PHP-Dokumentation: file_exists() is_dir() is_file() is_link() is_readable() is_writable() is_executable() filetype() filesize() fileowner() filegroup() fileperms() mime_content_type() filectime() filemtime() fileatime() stat() lstat()

Mit der Funktion file_exists() kann geprüft werden, ob ein Ordner oder eine Datei bereits existiert. Dies ist insbesondere zur Ausnahmebehandlung sinnvoll. Außerdem können diverse Objekteigenschaften abgefragt werden:

is_dir() – prüft, ob ein Objekt ein Ordner ist
is_file() – prüft, ob ein Objekt eine Datei ist
is_link() – prüft, ob ein Objekt ein Symlink ist
is_readable() – prüft, ob ein Objekt lesbar ist
is_writable() – prüft, ob ein Objekt schreibbar ist
is_executable() – prüft, ob ein Objekt ausführbar ist
filetype() – Typ (dir, file oder link)
filesize() – Dateigröße in Bytes
fileowner() – Besitzer-ID
filegroup() – Gruppen-ID
fileperms()Rechte (dezimal)
mime_content_type()Content-Typ einer Datei
filectime() – Zeitstempel der Änderung der Metadaten einer Datei
filemtime() – Zeitstempel der Änderung des Inhalts einer Datei
fileatime() – Zeitstempel des letzten Zugriffs auf eine Datei

Die Funktion stat() erzeugt ein Array mit diversen Objekteigenschaften. Bei Symlinks sind dies die Eigenschaften der referenzierten Datei. Benötigt man die Eigenschaften des Symlinks selbst, verwendet man lstat().

Code kopieren
  $file = "scripts/test/data.txt";
  
  if (file_exists($file)) {
    if (is_dir($file)) echo $file." ist ein Ordner.<br>";
    if (is_file($file)) echo $file." ist eine Datei.<br>";
    if (is_link($file)) echo $file." ist eine Verknüpfung.<br>";
    if (is_readable($file)) echo $file." ist lesbar.<br>";
    if (is_writable($file)) echo $file." ist schreibbar.<br>";
    if (is_executable($file)) echo $file." ist ausführbar.<br>";
    echo filetype($file)."<br>";
    echo filesize($file)."<br>";
    echo fileowner($file)."<br>";
    echo filegroup($file)."<br>";
    echo fileperms($file)."<br>";
    echo mime_content_type($file)."<br>";
    echo filectime($file)."<br>";
    echo filemtime($file)."<br>";
    echo fileatime($file)."<br>";
  }

  echo "<pre>";
  print_r(stat($file));
  echo "</pre>";

Ordnerinhalt auslesen

► PHP-Dokumentation: scandir()

Die Funktion scandir() schreibt den Inhalt des übergebenen Ordners in ein Array, das anschließend ausgelesen werden kann.

Code kopieren
  $path = "scripts";
  $scan = scandir($path);
  foreach ($scan as $object) echo $object."<br>";

Folgendes Skript veranschaulicht, wie mit Hilfe der Funktion scandir() ein Verzeichnisbaum erstellt werden kann:

Code kopieren
<?php
  header("Content-Type: text/html; charset=utf-8");
  function html($str) {
    return htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8');
  }
  function dirtree($dir, $indent) {
    $tree = "";
    if (is_readable($dir)) {
      $subtree = "";
      $dirscan = scandir($dir);
      foreach ($dirscan as $object) {
        if ($object != "." && $object != ".." && is_dir($dir.$object)) {
          $subtree .= $indent."    <li>".html($object);
          $subtree .= dirtree($dir.$object."/", $indent."    ");
          $subtree .= "</li>\r\n";
        }
      }
      if ($subtree != "") {
        $tree .= "\r\n".$indent."  <ul>\r\n";
        $tree .= $subtree;
        $tree .= $indent."  </ul>\r\n".$indent;
      }
      reset($dirscan);
    }
    return $tree;
  }
  echo "<!DOCTYPE HTML>
<html lang='de'>
  <head>
    <title>Dateisystem</title>
    <meta charset='UTF-8'>
  </head>
  <body>";
  echo dirtree($_SERVER['DOCUMENT_ROOT']."/", "  ");
  echo "</body>
</html>";
?>

Besitzer, Gruppe und Rechte ändern

► PHP-Dokumentation: chown() chgrp() chmod() lchown() lchgrp() posix_getpwuid() posix_getgrgid()

Der Besitzer eines Ordners oder einer Datei lässt sich mit der Funktion chown() ändern, die Gruppenzugehörigkeit hingegen mit der Funktion chgrp(). Die Dateirechte können mit der Funktion chmod() geändert werden. Bei Symlinks beziehen sich diese Änderungen auf die referenzierte Datei. Sollen die Eigenschaften des Symlinks selbst geändert werden, so verwendet man entsprechend die Funktionen lchown() bzw. lchgrp().

Hierbei ist zu beachten, dass in der Regel nur der Systemadministrator den Besitzer und die Gruppenzugehörigkeit ändern kann. Außerdem treten diese Änderungen erst nach Ablauf des Skripts inkraft.

Mit den Funktionen posix_getpwuid() bzw. posix_getgrgid() lassen sich zu der numerischen ID eines Besitzers bzw. einer Gruppe der eintsprechende Name finden.

Code kopieren
  $file = "scripts/test/data.txt";
  
  if (file_exists($file)) {
    echo posix_getpwuid(fileowner($file))['name']."<br>";
    echo posix_getgrgid(filegroup($file))['name']."<br>";
    echo decoct(fileperms($file))."<br>";
    chown($file, 1000);
    chgrp($file, 1000);
    chmod($file, 0644);
    echo posix_getpwuid(fileowner($file))['name']."<br>";
    echo posix_getgrgid(filegroup($file))['name']."<br>";
    echo decoct(fileperms($file))."<br>";
  }

In Dateien schreiben und aus ihnen lesen

► PHP-Dokumentation: file_put_contents() file_get_contents() file() readfile()

Mit der Funktion file_put_contents() lassen sich Textdateien erzeugen, deren Inhalt aus dem übergebenen String besteht. Die übergeordneten Ordner des übergebenen Pfades müssen bereits existieren. Um eine Textdatei in einen String einzulesen, wird die Funktion file_get_contents() verwendet.

Die Funktion file() liest eine Textdatei zeilenweise in ein Array, dass anschließend ausgelesen werden kann.

Die Funktion readfile() gibt die übergebene Datei ohne Umwege aus.

Code kopieren
  $file = "scripts/test/data.txt";

  $write = "Erste Zeile\nZweite Zeile\nDritte Zeile";
  file_put_contents($file, $write);

  $read = file_get_contents($file);
  echo nl2br($read)."<br>";  # wandelt \n in <br> um
  
  $lines = file($file);
  foreach ($lines as $line) echo $line."<br>";
  
  readfile($file);

Ordner und Dateien löschen

► PHP-Dokumentation: unlink() rmdir()

Mit der Funktion unlink() lassen sich Dateien wieder löschen. Um einen Ordner zu löschen, verwendet man die Funktion rmdir(). Allerdings funktioniert diese Funktion nur, wenn der betreffende Ordner im übergebenen Pfad auch leer ist. Ansonsten kann man folgende Funktion verwenden, um Ordner einschließlich sämtlicher Inhalte zu löschen, vorausgesetzt, man verfügt über die notwendigen Rechte:

Code kopieren
  function rrmdir($dir) {
    if (is_dir($dir)) {
      $dirscan = scandir($dir);
      foreach ($dirscan as $object) {
        if ($object != "." && $object != "..") {
          if (is_link($dir."/".$object)) {  # object is symlink
            if (!unlink($dir."/".$object)) return FALSE;
          } elseif (is_dir($dir."/".$object)) {  # object is folder
            if (!rrmdir($dir."/".$object)) return FALSE;
          } else {  # object is file
            if (!unlink($dir."/".$object)) return FALSE;
          }
        }
      }
      if (!rmdir($dir)) return FALSE;
      return TRUE;
    } else return FALSE;
  }

  $file = "scripts/test/data.txt";
  unlink(Sfile);

  $dir = "scripts/test";
  rmdir($dir);   # nur bei leeren Ordner
  rrmdir($dir);   # auch bei nicht leeren Ordner