8. Verwaltung von Dateien
8.2 Flagzeichen für FileCopy, FileMove und FileDelete 8.3 Arbeit mit Dateinamen - FileRename, FileGetDosName$(), FileSetDosName 8.4 Suchen nach Dateien - FileFindFirst$(), FileFindNext(), FileFindDone ^8.1 Kopieren, Verschieben und LöschenDie 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.FileCopyFileCopy kopiert eine Datei. Das kann eine DOS oder eine GEOS-Datei sein.
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" |
FileMoveFileMove verschiebt eine Datei, indem zuerst FileCopy ausgeführt wird und anschließend die Originaldatei gelöscht wird.Syntax: FileMove quelle$, ziel$ [, flags$] 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.
FileDeleteFileDelete 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.
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 FileDeleteDie 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.
KonzeptionMit Hilfe der Flagzeichen können Sie angeben:
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.
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:
Codebeispiele unter Verwendung der FlagzeichenWenn 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 DateinamenGEOS-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.
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.
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$] 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 DateienR-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.
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.
Die Systemvariable fileError wird nicht beeinflusst. FileFindDoneGibt 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.
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
|
^ |