Benutzer:TS/Umgang mit Dateien

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Im Kapitel "Umgang mit Dateien" will ich weder das PHP-Manual wiederholen, noch einen Grundkurs in Datentechnik geben. Vielmehr ist die Intention des Artikels, häufige Fehler durch Nochnichtwissen, Faulheit oder Arroganz zu verringern. Diese Fehler führen später in Systemen häufig zu schwer identifizierbaren Fehlern und in größeren Systemen auch zu gravierenden Sicherheitslücken. Zumindest ist immer die Integrität der Daten in Gefahr. Da ich auch nicht alles weiß, bin ich immer für begründete Ergänzungen und Korrekturen dankbar.

Trotzdem sollten wir vorne anfangen. Einige Grundlagen sollen für diesen Artikel als gegeben gelten. Sollte jemand in den Grundannahmen gravierende Fehler entdecken, bitte ich um sofortige Rückmeldung, da dies dann Auswirkungen auf den gesamten Artikel hätte.

Ich bitte die Leser, bevor sie Ergänzungen vornehmen wollen, den im Artikel angebotenen Links zu folgen und fleißig zu lesen. Unter diesen Links findet man weitere Grundlagen beschrieben.


Daten allgemein

In der klassischen Datentechnik kam irgendwann der Zeitpunkt, von dem an man Daten binär dargestellt, gespeichert und verarbeitet hat. Hier wollen wir beginnen.

Die Datentechnik hat sich ab jenem Zeitpunkt explosionsartig entwickelt. Wenn man anfänglich noch mit fünf Bits auskam (Fernschreiber) wurde dieser Code, der noch per Lochstanzer in Papierstreifen gestanzt wurde, bald verdoppelt (Shift-Funktion) und landete dann irgendwann um 1963 bei sieben (ASCII) oder acht (EBCDIC, [EBCDIC]) Bit Breite für ein Zeichen. Eine Stanzung mit acht Bit nannte man dann Byte. Die Ein-Byte-Codierung war geboren.

Es folgten bald das Magnetband und kurz darauf auch die Hard Disk. Aus der Magnetbandzeit stammen noch solche Begriffe, wie zurückspulen (rewind), vorspulen (wind), usw., sowie einige Steuerzeichen. Die Begriffe findet man noch heute in Funktionsnamen wieder, die Steuerzeichen sind fast alle noch in aktuellen Codierungen vorhanden, auch wenn sie oft keine echte Funktion mehr haben.

Zusammengefasste Datenfolgen nannte man dann "Datei". Befanden sich auf Lochstreifen meistens nur jeweils eine Datei, so waren es auf dem Magnetband und später auf der Festplatte bereits Hunderte und heute sogar Millionen.

Die Festplatte (Hard Disk) hat gegenüber dem Magnetband den großen Vorteil, dass man einen (nahezu) wahlfreien Zugriff auf die Daten darauf vornehmen kann. Man muss also nicht mehr vor- oder zurückspulen, sondern lässt einfach die Daten unter dem Schreib- Lesekopf vorbeisausen, bis die passende Zugriffsstelle erreicht ist. Anders, als bei der Schallplatte, sind die Daten darauf in konzentrischen Spuren (Tracks, Cylinders) abgespeichert. Diese Spuren sind in Blöcke eingeteilt, anfänglich wie Tortenstücke, schon kurze Zeit darauf gegeneinander versetzt (Interleave, Spurversatz), da auf dem großen Umfang mehr Daten gespeichert werden können, als auf den kleinen inneren Spuren.

Diese Aufgabe lösen seit IDE die Festplattenhersteller. Dadurch ist es bereits dem Betriebssysenm möglich, auf logische Blöcke lesend und schreibend zuzugreifen. Genaugenommen ist dafür ein Subsystem - das Filesystem - zuständig. Dem Programmierer macht das Betriebssystem seine rudimentären Funktionen durch APIs für die jeweilige Hochspsrache zugänglich und diese stehen und dann, auch in PHP, für die Bearbeitung von Dateien zur Verfügung. Auf das Filesystem müssen wir später noch näher eingehen.

Datentypen

Dem platzsparenden Speichern von Daten, der schnellen Verarbeitbarkeit und der Sortierbarkeit verdanken wir die grundlegenden Datentypen.

Was wird gespeichert? Datentyp Wie wird gespeichert?
Ganze Zahlen Integer binär
Fraktale Zahlen Single, Double, Real binär
Darstellbare Zeichen Character kodiert
Darstellbare Zeichenketten String kodiert z. B. mit führendem Längenbyte oder abschließender NULL (0x00)
Kalenderdaten Datum, Zeit BCD, kodiert als zusammengesetzter Typ, binär (Timestamp [1], [2])

Codierung

Grundsätzlich darf man wohl sagen, dass man später immer wissen muss, wie man Daten früher gespeichert hat. Bits alleine geben keine hinreichende Auskunft, sondern man muss wissen, an welcher Stelle man welche Bits wie zu interpretieren hat. Die Vereinbarungen dazu nennen sich dann "Speicherformat" oder "Codierung".

Dateiarten allgemein

Auf modernen (PC)-Computersystemen gibt es allerhand unterschiedliche Dateiarten. Sie unterscheiden sich je nach Betriebssystem/Filesystem und Verwendungszweck. Wir gehen nur auf diejenigen näher ein, die für PHP im Webumfeld relevant sind.

Um mit Dateien arbeiten zu können, müssen wir sie grundsätzlich in den Arbeitsspeicher laden (Stand 2016). Dies kann stückweise (blockorientiert, "zeilenweise") geschehen, oder im Ganzen. Für das Laden im Gnazen benötigt man dann selbstvertändlich genügend Hauptspeicher.

Der Begriff des Dateiformats

Um Daten in einer Datei zu speichern (*wegschreiben*), und später gezielt wieder lesen (*holen*) zu können, bedarf es des Wissens darüber, wo die Daten in der Datei stehen, oder wie man ihren Speichereplatz erkennen kann und wie sie kodiert sind.

Lesearten

  • Vollständig
  • Zeilenweise
  • Byteweise
  • Blockweise
  • Seitenweise


MIME-Typen

Textdateien, serielle Dateien

Byte- und Blockorientierte Dateien

Datendateien mit fester Feld- und Satzlänge

Datendateien mit fester Satzgröße und variabler Feldlänge

Ausführbare Dateien

Skripte

Konfigurationsdateien

Datenbank-Dateien

Dateiarten in PHP

Zugriffsrechte

Jedes Betriebssystem lässt die Zugriffsrechte und -arten durch sein Filesystem etwas anders gestalten. Teilweise sind die Filesysteme auch wählbar/austauschbar. Unterschiedliche Filesysteme haben wiederum oft eigene Möglichkeiten. Da der Zugrifv auf Geräte und damit auch auf Dateien aber grundsätzlich über das Betriebssystem erfolgen sollte, beschränken wir uns hier auf die häufigsten (eigentlich immer) verfügbaren Methoden und Funktionen. Da im Webumfeld hauptsächlich Unixderivate, vornehmlich Linux, vorkommen, betrachten wir in der Hauptsache Linux.

Owner:Group:User

Flags

Anlegen, löschen, lesen, schreiben, lesen + schreiben

namensbasiert versa handlebasiert, was ist der Unterschied?

Lesen und schreiben

Stringfunktionen

einfaches Lesen

Erstellen von Dateien

einfaches Schreiben

Kooperatives Arbeiten

Schreiben ohne Überschreiben

Race Conditions

Locking

Kooperatives Lesen und Zurückschreiben

Dead Locks