Kategorie: Dateizugriff
Frage: Wie kann ich Dateien in ASP dynamisch einbinden?
Normalerweise werden Dateien mit dem Statement:
<!--#include file="<verzeichnis>/<datei.inc>" //--> oder
<!--#include virtual="/<verzeichnis>/<datei.inc>" //-->
eingebunden.

Um je nach Auswahl eines Parameters eine Datei dynamisch einzubinden, muessen Sie zunächst
die Vorgehensweise des ASP-Parsers beim Ausführen einer ASP-Seite verstehen.

[index.asp]
<%
Response.Buffer = True
' --- Weiterer ASP-Code
%>
<!--#include file="inc/datei1.inc" //-->
<%
' --- Weiterer ASP-Code
%>
<html>
...
</html>

1.) Lesen der Datei index.asp
2.) Suchen der eingebundenen Dateien
3.) Lesen der eingebundenen Dateien in der Reihenfolge Ihrer Deklaration
4.) Untersuchen des in der Include-Datei enthaltenen ASP-Codes auf Syntaxfehler
5.) Untersuchen des in der ASP-Seite enthaltenen ASP-Codes auf Syntaxfehler
6 a.) Ausführen des Codes in der ASP-Seite
6 b.) Ausführen des Codes in der Include-Datei (wenn  der Code nicht in Funktionen gekapselt wurde)
6 c.) Ausführen des weiteren Codes in der ASP-Seite
7.) Ausgabe des erzeugten HTML-Contents

Sollte eine Include-Datei nicht gefunden werden, wird ein Fehler erzeugt, der Sie darauf hinweist.
Die ASP-Seite kann nicht ausgeführt werden. Ebenso wird bei Syntaxfehlern in einer Include-Datei
oder der ASP-Seite ein Fehler ausgegeben.

Es gibt mehrere Arten dynamischer Einbindung von Dateien:
Wenn die einzubindenen Dateien Code enthalten, der vor der Ausgabe ausgeführt werden soll, müssen
alle Dateien vorher existieren. Die Einbindung erfolgt dann folgendermaßen:

<%
Select Case Parameter
    Case 1:%><!--#include file="inc/datei1.inc" //--><%
    Case 2:%><!--#include file="inc/datei2.inc" //--><%
    ...
End Select
%>

ein dynamisches Einbinden von Dateien auf folgende Art wird immer fehlschlagen:
<!--#include file="inc/<%=<variable>%>" //-->

Die Fehlermeldung lautet dann in etwa:
"File 'inc/<%=<variable>%>' not found" oder
"Datei 'inc/<%=<variable>%>' nicht gefunden"



Alternativ gibt es noch weitere Methoden zum dynamischen Einbinden von Dateien, deren
Inhalt aber ausgeführt werden muss. Bei beiden Methoden ist "Execute" das Schlüsselwort.

Seit Windows 2000 (bzw. IIS 5) gibt es die Methode Execute des Server-Objekts. Hiermit
können Sie eine andere ASP-Datei ähnlich wie mit Include in ihr Skript einbinden. Es gibt
hier aber nicht das Problem, dass der Dateiname schon vorher hart codiert werden muss.
Sie können also mit folgendem Code eine Datei dynamisch einbinden:

<%
...

Dim strFileName
    strFileName = "include.asp"

    Server.Execute( strFileName )

...
%>

Wie gesagt, gibt es diese Methode erst seit IIS 5. Unter Windows NT 4 lässt sich diese Methode
daher nicht verwenden. Falls Sie noch Windows NT 4 verwenden, greifen Sie auf die im folgenden
vorgestellte Methode "Execute" der Scripting-Engine zurück.

Damit können Sie einen normalen String von der VBScript-Engine ausführen lassen. Hierbei
gilt natürlich auch, dass der Quellcode keine Fehler enthalten darf, da ansonsten eine Fehlermeldung
von der VBScript-Engine zurückgegeben wird.

Nachfolgend ein Beispiel, wie sich eine solche Datei einbinden und der Inhalt ausführen lässt.
Die Datei index.asp bindet hierbei über das FSO die Datei inc\datei1.inc ein und führt deren
Inhalt aus. Diese einzubindende Datei darf allerdings keine Skriptbegrenzer oder HTML-Tags
enthalten. Wenn Sie HTML-Tags oder sonstigen Text ausgeben wollen, der kein ASP-Code ist,
müssen Sie diesen per Response.Write in der Include-Datei ausgeben.

[index.asp]
<%
Set objFileSys = Server.CreateObject("Scripting.FileSystemObject")

    Set objFile = objFileSys.OpenTextFile(Server.MapPath("./") & "\inc\datei.inc")

        ' --- Lesen des gesamten Dateiinhalts
        FileContent = objFile.ReadAll

        objFile.Close
    Set objFile = Nothing

Set objFileSys = Nothing

' --- Übergeben des Dateiinhalts (VBScript-Code)
' --- an die Anweisung Execute der VBScript-Engine.
' --- Diese wird den Code parsen (auf Syntaxfehler,...
' --- prüfen und ggfs. an dieser Stelle ausführen.
Execute(FileContent)

' --- Ausgabe der Variablen IncludeText
' --- die in der Include-Datei definiert wurde.
' --- Somit kann man auch die Variablendeklaration
' --- in einer solchen Datei erledigen, was z.B.
' --- bei mehrsprachigen Webs sehr nützlich ist.
Response.Write IncludeText & "<br>"
%>

[datei1.inc]
Const IncludeText = "Hallo Welt"
Const IncludeNumber = 5

' --- Prüfung der Variablen IncludeNumber
' --- auf den Wert 5.
If IncludeNumber = 5 Then
    Response.Write "Alles OK"
    Else
        Response.Write "Wert nicht 5"
End if



Wenn Sie eine "normale" HTML-Datei einbinden oder lediglich den Text einer Datei anzeigen,
empfiehlt sich der Einsatz des FileSystem-Objekts.
<%
' --- Zuweisen des Dateipfads und des Dateinamens
Dim FilePath
    FilePath = Server.MapPath("./") & "\"
Dim FileName
    FileName = Request("FileName")

' --- Erzeugen des FileSystemObjects
Set objFileSys = Server.CreateObject("Scripting.FileSystemObject")

    ' --- Prüfen, ob die ausgewählte Datei existiert
    If objFileSys.FileExists(FilePath & FileName) Then

        ' --- Öffnen der Datei und Lesen des gesamten Inhalts in die Variable strFileContent
        Set objFile = objFileSys.OpenTextFile(FilePath & FileName, 1, False)
            strFileContent = objFile.ReadAll
            ...
            objFile.Close
        Set objFile = Nothing

        Else

            ' --- Die Datei existiert nicht
            Response.Write "Die gewünschte Datei " & FileName & " existiert nicht."

    End if

Set objFileSys = Nothing
%>
Copyright 2000 - 2024 by Stefan Falz Webconsulting