Folgende Funktionen werden hier besprochen:
| GetDir |
aktuelles Verzeichnis ermitteln |
| MakeDir |
Verzeichnis anlegen |
| DelDir |
Verzeichnis löschen |
| ChDir |
aktuelles Verzeichnis wechseln |
| FirstDir |
ersten Verzeichniseintrag ermitteln |
| NextDir |
nächsten Verzeichniseintrag ermitteln |
| DirInfo |
Verzeichniseintrag holen |
| today |
Systemdatum |
| now |
Systemzeit |
| DelFile |
Datei löschen |
| CopyFile |
Datei kopieren |
| CGIExec |
externes Programm ausführen |
| DiskFree |
freien Speicher in Partition ermitteln |
| GetEnv |
Umgebungsvariable ermitteln |
Allgemeines
Um systemübergreifend programmieren zu können, können alle Verzeichnisangaben im Unix-Format angegeben werden (also /home/tdbengine/test.prg statt home\tdbengine\test.prg unter Windows). Beachten Sie bitte, daß unter Unix Groß-/Kleinschreibung in Dateinamen unterschieden wird. Unser Tip: verwenden Sie nur Kleinbuchstaben und keine Sonderzeichen in Dateinamen, dann sind Ihre Anwendungen sicher von einer Plattform auf die andere portierbar.
Bitte beachten Sie, daß CGI-Programme normalerweise immer nur die Rechte des (in den meisten Fällen) anonymen Internet-Anwenders haben. Diesen muß also im Verzeichnis, in dem die CGI-Programme liegen, und im Verzeichnis der tdbengine wenigstens das Ausführungsrecht und das Leserecht eingeräumt werden. Wird mit Datenbanken gearbeitet, so muß entsprechend deren Zugriffen (nur lesend, lesend und schreibend) im Datenbank-Verzeichnis die Rechtegabe erfolgen. Selbst wenn keine neuen Tabellen angelegt werden sollen, so erfordert eine eventuelle Volltext-Indizierung auch das Recht, Dateien anzulegen.
Obwohl es den Sicherheitsaspekten des Internets nicht so ganz entspricht, ist es im Falle der CGI-Programmierung gebräuchlich, im CGI-Verzeichnis (und in den darunterliegenden Verzeichnissen) dem anonymen Internet-Anwender alle Rechte einzuräumen. Selbstverständlich darf das Verzeichnis via Anonymous-ftp niemals freigegeben werden! Damit übernehmen Sie als CGI-Programmierer eine ganze Menge Verantwortung, denn der Internet-Anwender kann alle Programme ausführen, die hier vorliegen. Sie müssen also daür sorgen, daß
- keine fremden Programme hier gespeichert werden können, und
- Ihre Programme keinen Mißbrauch erlauben.
Falls Sie CGI-Administrationsprogramme ebenfalls im Internet installieren (wie etwa unser program development kit), sollten Sie diese ausschließlich in einem (durch Benutzer-Identifizierung) geschützen Verzeichnis ablegen.
Das aktuelle Verzeichnis ermitteln
GetDir(Laufwerknummer : REAL) : STRING
GetDir() liefert das aktuelle Verzeichnis. Ist die Laufwerknummer 0, so wird das aktuelle Verzeichnis des aktuellen Laufwerks geliefert. Unter
Unix gibt es keine verschiedenen Laufwerke, deshalb muß hier immer 0 angegeben werden.
Hinweis:Die tdbengine wechselt immer in das Verzeichnis, in dem das auszuführende prg-File ist.
Anlegen und Löschen von Verzeichnissen
MakeDir(Dir : STRING) : REAL
Legt ein Verzeichnis an, falls der Anwender das Recht dazu hat. Konnte das Verzeichnis angelegt werden, so liefert die Funktion 0, andernfalls den Fehlercode des Betriebssystems.
DelDir(Dir : STRING) : REAL
Löscht das angegebene Verzeichnis, falls der Anwender das Recht dazu hat. Es können nur leere Verzeichnisse gelöscht werden. Die Funktion liefert 0, wenn das Verzeichnis gelöscht wurde, andernfalls den Fehlercode des Betriebssystems.
Verzeichnis wechseln
ChDir(Dir : STRING) : REAL
Wechselt in das Verzeichnis. Liefert 0, wenn der Wechsel erfolgreich war, andernfalls den Fehlercode des Betriebssystems.
Suche in Verzeichnissen
FirstDir(Pfad,Option : STRING) : STRING
NextDir : STRING
Der Pfad ist eine Verzeichnisangabe, in der auch Wildcards erlaubt sind. Unter Unix sind auch erweiterte Muster der Form "*abc" möglich. Die Option wird nur unter Windows ausgewertet. Es handelt sich dabei um einen String mit einer Kombination folgender Zeichen:
- D sucht auch Verzeichnissen
- H sucht nach versteckten Dateien
- S sucht nach Systemdateien
Zusätzlich wird immer nach einfachen Dateien gesucht.
Hinweis: Änderung gegenüber Vorgängerversion VDP und TDB!
Das Ergebnis der Funktion ist ein Leerstring, wenn kein (weiterer) Verzeichniseintrag vorliegt, andernfalls ein String mit folgendem Aufbau:
| Zeichen |
Inhalt |
| 1..63 |
Dateiname |
| 64..70 |
Dateiattribute |
| 71..82 |
Dateigröße |
| 84..94 |
Datum der letzen Änderung |
| 95..102 |
Zeit der letzten Änderung |
| 110..118 |
Rechte in der Form uuugggooo (nur bei Linux) |
| 128..255 |
Verzeichnis (absolut) |
Beispiel: Ausgabe aller Dateien mit der Extension "html" im Verzeichnis "/home/tdbengine/doc"
VAR dir_entry : STRING
...
dir_entry:=FirstDir('/home/tdbengine/doc/*.html','')
WHILE dir_entry DO
CGIWriteLn(RTrim(dir_entry[1,63]+'<br>')
dir_entry:=NextDir
END
...
Hinweis: Die tdbengine liest beim Aufruf von FirstDir() alle passenden Verzeichniseinträge ein und stellt sie dann sukzessive zur Verfügung. Beim nächsten Aufruf von FirstDir() (und am Programmende) wird dieser interne Puffer wieder geleert. Diese Vorgegehensweise hat folgende Konsequenzen:
- es werden keine Systemressourcen belegt
-
NextDir() ist eine tdbengine-interne Funktion und führt zu keinen Systemcall
-
FirstDir() - NextDir() - Sequenzen können nicht geschachtelt werden
Wenn nur die Systemdaten (Datum, Größe, Existenz etc.) einer einzelnen Datei abgefragt werden soll, kann die Funktion DirInfo() eingesetzt werden:
DirInfo(Path : STRING) : STRING
Die Funktion liefert das selbe Ergebnis wie FirstDir(Path,''), kann aber auch innerhalb einer FirstDir() - NextDir() - Sequenz eingesetzt werden.
Systemdatum und Systemzeit
Today : REAL
Liefert das aktuelle Datum als Tage seit dem 1.1.1900. Mit DateStr(today) erhalten Sie das aktuelle Datum als String.
Now : REAL
Liefert die aktuelle Uhrzeit als Anzahl der Minuten seit Mitternacht.
Hinweis:
Frac(Now)*60
liefert die Sekunden mit einer Auflösung 1/1000 s
Mit
TimeStr(Now)
erhalten Sie die aktuelle Uhrzeit als String
Beispiel:
| TimeStr(now) |
18:32 |
| TimeStr(now,0) |
18:32:47 |
| TimeStr(now,3) |
18:32:47.251 |
Allgemeine Dateifunktionen
DelFile(Pfad : STRING) : REAL
Löscht die mit "Pfad" angegebene Datei, wenn es sich nicht um ein Verzeichnis handelt, und wenn der anonyme http-User das Recht dazu hat. Unter Windows wird ein eventuell bestehender Schreibschutz ignoriert. Das Funktionsergebnis ist 0, wenn die Datei gelöscht werden konnte, andernfalls der Fehlercode des Betriebssystems.
CopyFile(p_von, p_nach : STRING) : REAL
Damit wird die Kopie einer Datei angelegt.
p_von darf sein:
- beliebiger Pfad innerhalb des Verzeichnisbaums
- interne Textdatei (Ramtext)
- URL (nur http://*, seit Version 6.2.6)
p_nach darf sein:
- beliebiger Pfad innerhalb des Verzeichnisbaums
- interne Textdatei (Ramtext)
- "con" (für Standardausgabe)
Hinweis: Wird mit CopyFile() auf die Standardausgabe kopiert, muss zurvor CgiCloseBuffer() aufgerufen werden, da CopyFile() die Pufferung umgeht.
Externes Programm ausführen
CGIExec(commandline : STRING [; s_timeout : REAL]) : REAL
Diese Funktion führt ein externes Programm aus.
Der Parameter s_timeout wird (vorläufig) nur unter Win9x / WinNT ausgewertet.
Das aufgerufene Programm wird komplett ausgeführt und gibt dann die Kontrolle an das CGI-Programm zurück. In diesem Fall liefert die Funktion das Ergebnis 0, in allen anderen Fällen den Fehlercode des Betriebssystems. Das aufgerufene Programm erhält die Ein- und Ausgabeströme des CGI-Programms. Deshalb sollte vor der Ausführung die Ausgabe-Pufferung beendet werden (da das externe Programm nicht in den tdbengine-Puffer schreiben kann).
Besonderheiten
Win9x, WinNT:
Das Programm wird direkt gestartet. Mit s_timeout kann die maximal verfügbare Zeit (in Sekunden) angegeben werden. Wird dann das Programm vorzeitig abgebrochen, ist der Funktionswert -1. Wird für s_timeout der Wert -1 angegeben, so wird das Programm zwar komplett ausgeführt, die Ausgabe jedoch unterdrückt. Diese Vorgegensweise ist der Ausgabeumleitung in jedem Fall vorzuziehen. Die Rechte des ausgeführten Programms werden aus den Rechten des Internet-Klienten abgeleitet.
Beispiel:
richtig: (pkzip25.exe befindet sich in /home/tdbengine/)
CGICloseBuffer .. Puffer leeren
CGIWrite('<pre>') .. Ausgabe entsprechend Bildschirm
CGIExec('pkzip25.exe -add backup.zip *') .. zeigt die gesamte Liste
CGIWriteLn('</pre>') .. UND erzeugt backup.zip im CGI-Verzeichnisz
richtig: (cmd.exe befindet sich in /home/tdbengine/)
...
CGIExec('cmd.exe /c set') .. zeigt das gesamte Environment
falsch: (cmd.exe und pkzip25 befinden sich in /home/tdbengine/)
...
CGIExe('cmd.exe /c pkzip25.exe -add backup.zip * > nul') .. erzeugt backup.zip ohne Ausgabe
richtig: (pkzip25.exe befindet sich in /home/tdbengine/)
CGIExec('pkzip25.exe -add backup.zip *',-1) .. erzeugt backup.zip ohne Ausgabe
Einschränkung: CGIExec kann (zumindest problemlos) nur echte 32-Bit Anwendungen ausführen.
Linux:
Die commandline von CGIExec() wird an die Shell des Internet-Klienten mit dessen Rechten übergeben.
Hinweis: Hier ist die Ausgabeumleitung der empfohlene Weg, die Ausgaben des aufgerufenen Programms zu unterdrücken.
Beispiel:
CGICloseBuffer .. Puffer leeren
CGIWrite('<pre>') .. Ausgabe entsprechend Bildschirm
CGIExec('set') .. zeigt das gesamte Environment
CGIWriteLn('</pre>')
...
CGIExec('tar -cz -fbackup.tar.gz *') .. erzeugt das Archiv backup.tar.gz mit Ausgabe
CGIExec('tar -cz -fbackup.tar.gz * > /dev/zero') .. erzeugt das Archiv backup.tar.gz ohne Ausgabe
Hinweise:
Sie sollten CGIExec() immer mit besonderer Vorsicht einsetzen. Keine Experimente!
Unterbinden Sie durch geeignete Semaphoren gleichzeitige Aufrufe (vor allem bei Archivierungsprogrammen).
Bedenken Sie, daß jeder CGI-Prozess nur eine beschränkte Zeit zur Verfügung hat (im http-Server einstellbar).
Freien Speicher in Partition ermitteln
class="code">DiskFree(drive : REAL) : REAL
drive: 0 = aktuelles Laufwerk (Win32) bzw. Partition, in der das aktuelle Verzeichnis liegt (Linux, FreeBSD)
1 = A: (nur Win32)
2 = B: (nur Win32)
...
Rückgabewert: Freier Platz in Laufwerk / Partition bzw. -1, falls Laufwerk nicht verfügbar
Umgebungsvariable ermitteln
GetEnv(Name : STRING) : STRING
GetEnv() liefert den Wert der Environment-Variablen mit dem angegebenen Namen.
Zusätzlich steht nach jedem Aufruf ein Ramtext mit dem Namen "ramtext:environment" zur Verfügung, der ebenfalls die
Environmentvariable enthält. Damit kann auch auf Environment-Variablen zugegriffen werden, deren Inhalt 255 Zeichen übersteigt.
Beispiel:
CGICloseBuffer
CGIWrite("<pre>")
GetEnv("HTTP_ACCEPT")
CopyFile("ramtext:environment","con")
CGIWriteLn('</pre>')
|