8. Verwaltung von Dateien

^

8.1 Kopieren, Verschieben und Löschen

Die R-BASIC Befehle zum Kopieren, Verschieben und Löschen von Dateien sind in ihrer Grundsyntax sehr einfach anzuwenden und tun ihren Job "so gut wie möglich" indem sie z.B. auch versteckte, System- oder schreibgeschützte Dateien löschen bzw. überschreiben. Durch die Möglichkeit Flagzeichen anzugeben kann der ambitionierte Programmierer ihr Verhalten aber sehr gut steuern und sich dadurch viel Programmierarbeit sparen. Am Ende des Abschnitts finden Sie eine Beschreibung des Konzepts, das hinter den Flags steht und eine Auflistung aller Flagzeichen und ihrer Bedeutung. Mögliche Fehlercodes für die Variable fileError finden Sie im Anhang.

FileCopy

FileCopy kopiert eine Datei. Das kann eine DOS oder eine GEOS-Datei sein.
Syntax: FileCopy quelle$, ziel$ [, flags$]

quelle$: Bezeichnet die zu kopierende Datei. Pfadangaben sind zulässig

ziel$: Bezeichnet Ort und Namen, wohin die Datei kopiert werden soll.
Pfadangaben sind zulässig. Es muss der Name der neuen Datei enthalten sein. Er darf vom Namen des Originals abweichen (automatisches Umbenennen beim Kopieren).

flags$: Optional: Zeichenkette. Bestimmt das Verhalten für den Fall,
dass die durch ziel$ spezifizierte Datei schon existiert.

Standard (ohne flags$): vorhandene Dateien (ziel$) immer überschreiben,
auch schreibgeschützte und Systemdateien (entspricht dem Flagzeichen "a").

Ein oft sinnvoller Wert ist "am": Wie Standard, aber bei Problemen eine passende Meldungsbox ("m") anzeigen.

Im Abschnitt 8.3 finden Sie eine Auflistung aller Flagzeichen und ihrer Bedeutung sowie Beispiele für ihre Anwendung.


FileCopy kann keine Links kopieren. Die Variable fileError wird belegt (d.h. gesetzt oder gelöscht).

Beispiele:

Beispiele unter Verwendung des Flagstrings finden Sie im Abschnitt 8.2.

FileCopy "Termine von heute", "Backup der Termine von heute"
!  Kopie in ein entferntes Verzeichnis
datei$ = "Meine Daten"
FileCopy datei$, "F:\\Backup\\Januar\\" + datei$, "am"

FileMove

FileMove verschiebt eine Datei, indem zuerst FileCopy ausgeführt wird und anschließend die Originaldatei gelöscht wird.
Syntax: FileMove quelle$, ziel$ [, flags$]

quelle$, ziel$, flags$: Siehe FileCopy.


FileMove kann keine Links verschieben. Die Variable fileError wird belegt (d.h. gesetzt oder gelöscht).

Beispiele:

FileMove "Termine von heute", "Alte Version\\Termine von heute"
!  Verschieben aus einem entfernten Verzeichnis
datei$ = "Brief an Willi"
FileMove "F:\\Briefe\\Umzug\\" + datei$,  datei$, "am"
Beispiele unter Verwendung des Flagstrings finden Sie im Abschnitt 8.2.

FileDelete

FileDelete löscht eine Datei. Das kann eine DOS oder eine GEOS-Datei oder ein Link sein. Um einen Ordner zu löschen, verwenden Sie bitte FileDeleteDir.
Syntax: FileDelete datei$ [, flags$]

datei$: Bezeichnet die zu löschende Datei. Pfadangaben sind zulässig.

flags$: Optional: Einstellung der Reaktion auf Fehler oder bestimmte Situationen.

Standard (ohne flags$): Dateien immer löschen, auch schreibgeschützte und Systemdateien (entspricht "a").

Es sind die gleichen Flagzeichen wie bei FileCopy und FileMove zulässig. Ein oft sinnvoller Wert ist "am": Wie Standard, aber bei Problemen eine passende Meldungsbox ("m") anzeigen.


Die Variable fileError wird belegt (d.h. gesetzt oder gelöscht). Es ist ein Fehler, wenn die Datei nicht existiert.

Beispiele:

Beispiele unter Verwendung des Flagstrings finden Sie im Abschnitt 8.2.

FileDelete "Meine Daten"
FileDelete "C:\\TEMP\\Logfile.log" , "am"

^

8.2 Flagzeichen für FileCopy, FileMove und FileDelete

Die Flagzeichen modifizieren das Verhalten von FileCopy, FileMove und FileDelete. Für FileDelete kann man so z.B. angeben ob bestimmte Dateien automatisch gelöscht werden oder ob nachgefragt werden soll. Bei FileCopy oder FileMove kann es passieren, das das Kopierziel bereits existiert. Hier bestimmen die Flags z.B. ob diese schon vorhandene Datei automatisch gelöscht werden oder ob nachgefragt werden soll.

Geben Sie kein Flagzeichen an, so wird der Standard "a" genommen.

Hinweise:

FileCopy, FileMove und FileDelete sind standardmäßig (d.h. ohne Angabe spezieller Flagzeichen) so eingestellt, dass sie ihren Dienst "bestmöglich" verrichten. FileDelete versucht alle Dateien, auch schreibgeschützte und Systemdateien, zu löschen und FileMove bzw. FileCopy versuchen, wenn das Kopierziel schon existiert, es zu überschreiben. Für viele Anwendungsfälle ist es daher nicht nötig, sich mit der komplexen Materie der Flagzeichen auseinanderzusetzen.

Konzeption

Mit Hilfe der Flagzeichen können Sie angeben:

  • Welche Dateitypen automatisch überschrieben bzw. gelöscht werden sollen (Flagzeichen "a", "f" und "L"). R-BASIC orientiert sich dabei am Dateityp (siehe Kapitel 6.1). Für schreibgeschützte und Systemdateien gibt es extra Flagzeichen ("r" und "h"). "f" ist eine Abkürzung für "evgd".

  • Ob nachgefragt werden soll, wenn eine Datei nicht automatisch überschrieben bzw. gelöscht werden soll ("q" oder "u"), oder ob dies als Fehler gewertet werden soll.

  • Ob R-BASIC im Fehlerfall (z.B. Datei nicht gefunden oder Zugriff verweigert) eine Meldung an den Nutzer ausgeben soll ("m") oder ob Sie das selbst programmieren wollen (kein "m" angegeben). Der Standard ist, das R-BASIC keine Meldungsbox erzeugt. Es ist oft sinnvoll, "m" anzugeben. Die Variable fileError wird in jedem (Fehler-) Fall gesetzt.

  • Ob in bestimmten Situationen immer ein Fehler erzeugt werden soll, d.h. die fileError-Variable gesetzt werden soll. (Flagzeichen "o", "i", "t")
Sie können den Flagzeichenstring durch Leerzeichen oder Bindestriche übersichtlicher gestalten. Er darf aber nicht länger als 64 Zeichen werden, sonst wird ein Laufzeitfehler erzeugt und das Programm beendet. Die Groß- bzw. Kleinschreibung wird ignoriert.


Allgemeine Flags, die mit allen anderen kombiniert werden können

m : Message: Dialogbox anzeigen, wenn ein Fehler auftrat.
Unabhängig davon wird die Variable fileError gesetzt.

o : Read-Only-Fehler: Erzwingt, dass beim Versuch,
eine schreibgeschützte Datei zu überschreiben oder zu löschen immer eine Fehlermeldung erzeugt wird.

i : Hidden-Fehler: Erzwingt, dass beim Versuch,
eine versteckte oder Systemdatei (Attribute FA_HIDDEN oder FA_SYSTEM) zu überschreiben oder zu löschen immer eine Fehlermeldung erzeugt wird.

t : Type-Fehler (nur FileMove und FileCopy):
Erzwingt, dass beim Versuch, eine DOS- durch eine GEOS-Datei (oder umgekehrt) zu überschreiben, immer eine Fehlermeldung erzeugt wird.
Das Flags "o" "i" "t" haben Vorrang vor allen anderen Flags. Die Variable fileError wird gesetzt und falls das Flag "m" angegeben wurde wird eine entsprechende Dialogbox angezeigt.


Flags für Dateien, die gelöscht bzw. überschrieben werden können

f : Files (= Dateien)
Normale Dateien sollen ohne Nachfragen überschrieben bzw. gelöscht werden.

Das schließt nicht ein: Links, schreibgeschützte, versteckte und Systemdateien.

Das Flag "f" ist eine Abkürzung für "e v g d". Statt "f" anzugeben kann man einzelne Dateitypen angeben:

e : Executable: Applikationen bzw. Libraries

v : VM-Dateien

g : Geos-Daten-Dateien

d : DOS-Dateien

L : Links sollen ohne Nachfragen überschrieben bzw. gelöscht werden.

r : Read-only: Schreibgeschützte Dateien sollen ohne Nachfragen
überschrieben bzw. gelöscht werden.

h : Hidden: Versteckte Dateien (Attribute FA_HIDDEN oder FA_SYSTEM)
sollen ohne Nachfragen überschrieben bzw. gelöscht werden.

a : Alle Dateien: "a" ist eine Abkürzung für "f L r h"


Behandlung von Dateien, die überschrieben oder gelöscht werden sollen, aber nicht durch die Dateiflags oben erfasst sind

q oder u : Question: R-BASIC fragt nach,
ob die Datei gelöscht / überschreiben werden soll. Der Unterschied ist:

q : Antwortet der Nutzer mit "Nein" so wird Variable fileError auf -1 (Abbruch durch Nutzer) gesetzt.

u : Antwortet der Nutzer mit "Nein" so wird Variable fileError gelöscht (Wert Null, OK).
Wird weder "q" noch "u" angegeben, so wird die Datei nicht gelöscht / überschrieben und die Variable fileError wird auf +5 (Zugriff verweigert) gesetzt. Das ermöglicht Ihnen, ein flexibles Fehlerhandling zu implementieren.

Beispiele für sinnvolle Flagzeichenstrings:

"a" : Dies ist der Standard für FileCopy, FileMove und FileDelete.

Alle Dateien und Links löschen / überschreiben, aber bei Fehler keine Meldung machen (nur fileError setzen). Ihr Programm übernimmt die Fehlerbehandlung selbst.

"a m" : Alle gefunden Dateien und Links werden überschrieben bzw. gelöscht
(auch schreibgeschützte und Systemdateien).

Meldung machen bei Fehler ("m"), z.B. Datei nicht gefunden.

"" (leerer String) : Niemals Dateien löschen/überschreiben
(sinnvoll für FileCopy und FileMove). fileError wird auf +5 (Zugriff verweigert) gesetzt, falls das Ziel schon existiert. Ihr Programm übernimmt die Fehlerbehandlung selbst.

"f Lq m" : Alle Dateien ("f") und Links ("L") löschen / überschreiben,
aber Nachfragen (Question "q" ) bei schreibgeschützten und Systemdateien (diese sind von "f" nicht abgedeckt). Meldung machen bei Fehler ("m").

"f Lrq m" : Wie "f Lq m" (siehe letztes Beispiel),
aber schreibgeschützte Dateien ("r") automatisch überschreiben und nur bei Systemdateien nachfragen.

"f Lq m i" : Alle Dateien ("f") und Links ("L")
löschen / überschreiben. Nachfragen (Question "q" ) bei schreibgeschützten Dateien, aber bei Systemdateien ("i") immer eine Fehler erzeugen (fileError setzen, aber nicht nachfragen). Meldung machen bei Problemen ("m").

"a o i t m" : Alle Dateien und Links löschen / überschreiben,
außer bei schreibgeschützten ("o"), versteckten bzw. Systemdateien ("i") und bei Typ-Fehlern ("t"): diese nicht löschen/überschreiben, Meldung machen ("m") und die fileError-Variable setzen.

Codebeispiele unter Verwendung der Flagzeichen

Wenn es zu einem Problem kommt (z.B. Datei nicht gefunden) wird immer die Variable fileError gesetzt. Mit dem Flagzeichen "m" erzeugt R-BASIC zusätzlich eine Dialogbox, die den Fehler beschreibt.

Vorhandene Datei immer löschen, und bei Fehler eine Dialogbox ausgeben.

FileCopy "Meine Daten" ,  "A:\\Meine Daten" ,"am"
FileDelete "A:\\Meine Daten" ,"am"

Der Standard ist, bei Problemen keine Meldungsbox auszugeben. Das entspricht dem Flagzeichenstring "a". Das Programm sollte dann eventuelle Fehler selbst behandeln.
FileDelete "A:\\Meine Daten"   ' Entspricht "a"
IF fileError THEN .....

Immer nachfragen wenn, wenn das Ziel schon existiert. Mit "m": R-BASIC meldet, wenn sich das Ziel nicht überschrieben lässt (ohne "m" wird nur fileError gesetzt)
Antwortet der Nutzer auf Nachfrage mit "Nein", wird fileError auf -1 (Abbruch durch Nutzer) gesetzt.
FileMove quelle$, ziel$, "q"
FileMove quelle$, ziel$, "qm"

Wie letztes Beispiel, aber bei "Nein" wird fileError auf Null gesetzt.
FileMove quelle$, ziel$, "u"
FileMove quelle$, ziel$, "um"

Normale Dateien überschrieben ("f"), bei schreibgeschützten und Systemdateien nachfragen. Mit "m": R-BASIC erzeugt eine Fehlerbox, wenn es ein Problem gab. Ohne "m": Ihr Programm ist verantwortlich indem es die Variable fileError abfragt.
FileCopy quelle$, ziel$, "fqm"

FileCopy quelle$, ziel$, "fq"
IF fileError THEN
  MsgBox "Fehler beim Kopieren von "+datei$ + " :\r" +
          ErrorText$(fileError)
END IF

Normale Dateien überschreiben bzw. löschen ("f"), bei schreibgeschützten nachfragen ("q") und bei Systemdateien immer fileError setzen ("i"). Die Leerzeichen zwischen den Flagzeichen sind zulässig und verbessern die Übersicht.
FileCopy quelle$, ziel$, "f q i m"
FileDelete ziel$, "f q i m"

^

8.3 Arbeit mit Dateinamen

GEOS-Dateien und Ordner haben neben ihrem langen, unter GEOS sichtbaren Namen noch einen DOS-Namen. Normalerweise wird der DOS-Name vom System automatisch vergeben. R-BASIC hat Zugriff sowohl auf den GEOS- als auch auf den DOS-Namen von Dateien und verfügt über die einzigartige Fähigkeit, den DOS-Namen bewusst zu manipulieren.

FileRename

Ändert den Namen einer DOS- oder GEOS-Datei oder eines Ordners. Der DOS-Name einer GEOS-Datei wird dabei vom System ebenfalls geändert.
Syntax: FileRename oldName$, newName$ [, flags$]

oldName$: Alter Dateiname. oldName$ darf einen kompletten Pfad enthalten.
Bei GEOS-Dateien bzw. Ordnern ist die Groß- Kleinschreibung zu beachten.

newName$: Neuer Dateiname. newName$ darf keinen Pfad enthalten.
Für DOS-Dateien muss newName$ der Konvention 8.3 entsprechen.

flags$: (optional): Zeichenkette, bestehend aus dem Buchstaben "m" (für Message),
die festlegt, ob im Fehlerfall (z.B. Datei nicht gefunden, neuer Name ungültig) eine Meldungsbox angezeigt wird.

Wird flags$ nicht angegeben, gibt es keine Meldungsbox.


Auch schreibgeschützte, System- oder versteckte Dateien sowie GEOS-Links können umbenannt werden. Die Systemvariable fileError wird gesetzt oder gelöscht.

Beispiele:

' Einfaches umbenennen
FileRename "E:\\Dateien\\info.txt", "info.bak"
' Umbenennen mit automatischer Fehlermeldung durch R-BASIC
FileRename "E:\\Dateien\\info.txt", "info.bak", "m"
' Umbenennen mit eigener Fehlermeldung
FileRename "E:\\Dateien\\info.txt", "info.bak"
IF fileError THEN MsgBox("Die Datei konnte nicht umbenannt
                            werden\rFehler: " +
                            ErrorText$(fileError))

FileGetDosName$

Liefert den DOS-Namen einer Datei oder eines Ordners.
Syntax: FileGetDosName$ ( geosName$ )

geosName$: Der GEOS-Name der Datei.
geosName$ darf auch eine DOS-Datei bezeichnen.

Die Systemvariable fileError wird gesetzt oder gelöscht.

Beispiel:

DIM name$
name$ = "Write unbenannt"
Print name$, FileGetDosName$ (name$)

FileSetDosName

Ändert den DOS-Namen einer GEOS-Datei oder eines Ordners. Der lange GEOS-Name wird nicht geändert.
Syntax: FileSetDosName oldName$, newName$ [,flags$]

oldName$, newName$ , flags$: siehe FileRename


Die Systemvariable fileError wird gesetzt oder gelöscht. Auch schreibgeschützte, System- oder versteckte Dateien können umbenannt werden.

Beispiele:

' Einfaches umbenennen
FileSetDosName "E:\\Dateien\\Draw Beispiel", "DRAW.777"
' Umbenennen mit automatischer Fehlermeldung durch R-BASIC
FileSetDosName "E:\\Dateien\\Draw Beispiel", "DRAW.777", "m"
' Umbenennen mit eigener Fehlermeldung
FileSetDosName "E:\\Dateien\\Draw Beispiel", "DRAW.777"
IF fileError THEN MsgBox("Der DOS-Name der Datei konnte nicht
                          geändert werden\rFehler: " +
                          ErrorText$(fileError))

^

8.4 Suchen nach Dateien

R-BASIC unterstützt die Suche nach Dateien und Ordnern mit den Befehlen FileFindFirst$, FileFindNext$ und FileFindDone. FileFindFirst$ durchsucht den Ordner und initialisiert ein Handle, das von FileFindNext$ und FileFindDone verwendet wird. FileFindFirst$ liefert den ersten Datei- bzw. Ordnernamen. Die nächsten Datei- bzw. Ordnernamen werden von FileFindNext$ geliefert.

FileFindDone gibt nach getaner Arbeit das Handle wieder frei.

FileFindFirst$, FileFindNext$ und FileFindDone beeinflussen fileError nicht.

FileFindFirst$

Sucht den ersten Datei- bzw. Ordnernamen. Initialisiert ein Handle, dass von FileFindNext$ und FileFindDone verwendet wird.
Syntax: <name$> = FileFindFirst$ (<han> [, mask$ [, flags$ [ , <token> ] ] ] )

<han>: Variable vom Typ Handle. Ausdrücke (z.B. Funktionsaufrufe) sind nicht zulässig.

mask$: (optional): Dateimaske, die auf die zu findende Datei passen muss.
Default: "*" ( = alle Dateien und Ordner finden)

Es gelten die GEOS-Namens-Konventionen:
* : (Sternchen): beliebige Anzahl (oder Null) Zeichen oder Ziffern

? : Genau ein Zeichen oder eine Ziffer

: und \ sind nicht zulässig

Groß- bzw. Kleinschreibung und Leerzeichen werden berücksichtigt.

Für DOS-Dateien sind Großbuschstaben anzugeben.

Die Maske darf keinen Pfadanteil enthalten!

Beispiele: "*a*" findet alle Dateien, deren Name ein 'a' enthält
"X*" findet alle Dateien, deren Name mit 'X' beginnt

"X*e" Der Name muss mit 'X' beginnen und auf "e" enden.

flags$: (optional) Zeichenkette, die bestimmt,
welche Dateitypen gefunden werden sollen. Zulässig sind:
e : Executable: Applikationen bzw. Libraries

g oder v : Geos-Daten-Dateien bzw. VM-Dateien. Eine Unterscheidung zwischen beiden ist nicht möglich

d : DOS-Dateien

f oder o : Folders (Ordner)

a : Alle Dateien und Ordner. Abkürzung für "e g d f"

L : Links

Wird flags$ nicht angegeben wird "a L" angenommen (alles finden).

<token>: (optional) GeodeToken der zu findenden Datei.
Wird "token" nicht angegeben, gibt es keine Einschränkung. Um "token" angeben zu können, muss man "flags$" angeben und "flags$" muss GEOS-Dateien einschließen (e, g bzw. a).

Hinweis: Ordner werden immer gefunden (wenn das Flag "f" angegeben ist), auch wenn sie nicht das entsprechende Token haben.


Die Systemvariable fileError wird nicht beeinflusst. Ist im aktuellen Ordner keine Datei oder Unter-Ordner enthalten, auf welche die Suchkriterien passen, wird ein Leerstring (Länge Null) zurückgegeben. Auch in diesem Fall muss FileFindDone gerufen werden!

FileFindNext$

Sucht den nächsten Datei- bzw. Ordnernamen. Ist keine weitere Datei oder Ordner verfügbar, wird ein Leerstring (Länge Null) zurückgegeben.
Syntax: <name$> = FileFindNext$ ( <han> )

<han>: Variable (oder Ausdruck) vom Typ Handle.
han muss von FileFindFirst$ initialisiert worden sein.

Die Systemvariable fileError wird nicht beeinflusst.

FileFindDone

Gibt das von FileFindFirst$ initialisierte Handle frei, indem die dahinter liegenden Datenstrukturen und Speicherbereiche freigeben werden. Dieser Schritt ist sehr wichtig, da Speicher im GEOS-System knapp ist.
Syntax: FileFindDone <han>

<han>:Variable (oder Ausdruck) vom Typ Handle.
han muss von FileFindFirst$ initialisiert worden sein.

Die Systemvariable fileError wird nicht beeinflusst.

Beispiel 1: Dateien und Ordner auflisten:

DIM han AS HANDLE
DIM name$
  name$ = FileFindFirst$ (han)     ! Handle initialisieren
  WHILE (name$ <> "")              ! Vergleich auf Leerstring
    Print name$,                   ! Komma am Ende tabuliert
    IF FileType(name$) = GFT_DIRECTORY THEN
      Print "<DIR>"
    ELSE
      Print FileSize(name$); " Bytes"
    END IF
    name$ = FileFindNext$ (han)    ! Handle benutzen
  WEND
  FileFindDone ( han )! Handle freigeben.
! Die Klammern sind optional.
! Die von han referenzierten Datenstrukturen werden freigegeben.
! Die in han gespeicherten Werte sind jetzt ungültig.
Beispiel 2: Alle Write-Dateien im Geos Top-Folder auflisten:
DIM han AS HANDLE
DIM name$
DIM token AS GeodeToken
  token.manufid = 0
  token.tokenChars = "WDAT"
  CLS
  SetStandardPath SP_TOP
  name$ = FileFindFirst$ (han, "*", "aL", token)
  WHILE ( name$ <> "" )
    if FileType(name$) <> GFT_DIRECTORY THEN Print name$
    name$ = FileFindNext$ (han)     ! Handle benutzen
  WEND
  FileFindDone ( han )              ! free handle

^

Weiter...