Ein erstes grundsätzliches Problem bei der plattformunabhängigen Programmierung von Dateizugriffen sind die unterschiedlichen Pfad-Notationen. DOS und seine Abkömmlinge wollen Backslashes, UNIXe vornübergeneigte Striche, das MacOS offenbar Doppelpunkte... Zwar hat SD schon bald damit begonnen, URLs zu verwenden. Diese erlauben eine einheitliche Pfad-Notation für die unterschiedlichsten Zugriffs-Protokolle (Fernzugriff übers Internet mittels «http» oder «ftp», «file» für lokale Dateien etc.). Doch leider berücksichtigen noch lange nicht alle Befehle in StarBasic diese Notation.
Glücklicherweise stellt uns das StarBasic einige Befehle zur
Verfügung, um die Plattform abzuchecken. So ist es uns möglich,
allenfalls diese Pfade selber in URLs umzuwandeln (hierfür
stellt SD meines Wissens keine Funktion zur Verfügung). Mittels
GetGUIType() lässt sich etwa die verwendete
graphische Oberfläche ermitteln. Damit wäre bereits eine
Funktion gegeben, um mit etwas Zusatzwissen die notwendigen
Pfad-Separatoren zu bestimmen:
Function GetOSPathSeparator$()
const cWindows = 1
const cPM = 2
const cMacintosh = 3
const cMotif = 4
const cOpenWindow = 5
Select Case ( GetGUIType() )
Case cWindows, cPM
' DOS-Abkömmlinge Windows und OS/2
GetPathSeparator$ = "\"
Case cMacintosh
' MacIntosh
GetPathSeparator$ = ":"
Case cMotif, cOpenWindow
' UNIX
GetPathSeparator$ = "/"
End Select
End Function
Und diese Funktion ermöglicht nun, die üblichen Pfade in korrekte URLs umzuwandeln:
' konvertiert Plattform-abhängige Pfade in eine URL vom Typ "file://"
Function GetLocalURL$(ByVal myPath$)
Dim OSPathSeparator$
Dim Pos%
Dim myLeft$, myRight$
' bei DOS-Abkömmlingen den Doppelpunkt des Laufwerks ersetzen
If GetGUIType() = 1 And Mid$(myPath$, 2, 2) = ":\" Then
myPath$ = Left$(myPath$, 1) + "|" + Mid$(myPath$, 3, Len(myPath$) - 2)
End If
' Pfad-Separator des zugrundeliegenden Systems bestimmen
OSPathSeparator$ = GetPathSeparator$()
' in einer Schleife alle Separatoren durch Slashes ersetzen
Pos% = InStr(myPath$, OSPathSeparator$)
Do While Pos% <> 0
myLeft$ = Left$(myPath$, Pos% - 1)
myRight$ = Mid$(myPath$, Pos% + 1)
myPath$ = myLeft$ + "/" + myRight$
Pos% = InStr(Pos%, myPath$, OSPathSeparator$)
Loop
' das korrekte Protokoll festlegen
GetLocalURL$ = "file://" + myPath$
End Function
Diese Funktion GetLocalURL$() wandelt nun etwa den Pfad «D:\Daten\Jahresbericht 1997.sdw» nach «file://D|/Daten/Jahresbericht 1997.sdw» um. Doch auch diese Notation ist alles andere als plattformunabhängig: die Laufwerksbuchstaben sind nur für DOS-Abkömmlinge zu gebrauchen. Um dieses Problem ist zu umgehen, gibt es nur eine Möglichkeit: relative Pfade. Makros, die in einem Dokument enthalten sind, können sich auf dessen Pfad beziehen. Über die Path-Eigenschaft lässt sich dieser bestimmen. Eine andere Möglichkeit, insbesondere, wenn die Makros als Bibliotheken im dafür vorgesehenen Verzeichnis liegen, ist die PathSettings-Eigenschaft: über diese lassen sich die Systempfade (Backup-, Konfigurations-, Graphikverzeichnisse etc.) der StarOffice-Installation erfragen. Ausgehend von diesen Pfaden, die jeweils schon in der Plattform-verträglichen Form geliefert werden, können nun die eigenen Zugriffe relativ adressiert werden.
Ist man sich gewohnt, für einen DOS-Abkömmling zu programmieren, so neigt man vielleicht dazu, Pfadangaben präventiv in Klein- oder Grossbuchstaben umzuwandeln. Dies verhindert Programm-intern Schwierigkeiten, wenn etwa die Benutzereingabe eines Pfades in Grossbuchstaben erfolgte, das System denselben Pfad aber in Kleinbuchstaben zurückgibt.
Diese Angewohnheit sollte sofort abgelegt werden, wenn es darum geht, für UNIX-Plattformen zu programmieren! Anders als Windows und OS/2 unterscheidet UNIX nämlich sehr wohl zwischen Gross- und Kleinschreibung bei Datei- und Pfadbezeichnungen. Soll den Anwendern anderer Plattformen dennoch die gewohnte Freiheit gewährt werden, so ist vorherig unbedingt mittels GetGUIType() abzuklären, auf welchem Betriebssystem das StarOffice gerade läuft:
... ' DOS-Pfade in Kleinbuchstaben vergleichen If GetGUIType() = 1 then PathOK = (LCase$(Source$) = LCase$(Target$)) Else PathOK = (Source$ = Target$) End If ...