Laufwerks-Zugriffe

Dateipfad-Notation

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.

Gross-/Kleinschreibung

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
...



Letzte Änderung: 19.03.98
Copyright ©1998 by Michael Herger