Fischer-Bayern.de
Letztes Update: 12.01.2005 | 1:11:02 Uhr
Write (2) 
Peter Fischer


Zurück zu read/write-Befehle Seite 1

Wir haben jetzt also eine Datei angelegt und einen Text hineingeschrieben. Wollen wir nun an diesen Text einen weiteren Text anhängen, genügt es nicht, das Skript mit einem neuen Text erneut laufen zu lassen. Ich habe ja bereits geschrieben, dass beim Zugriff auf eine Datei ein Positionszeiger verwendet wird. Sobald open for access verwendet wird, wird dieser Positionszeiger an den Dateianfang gesetzt.

Diesen Positionszeiger kann man sich auf zwei verschiedene Arten vorstellen.

1. Die Schreibmarke ist wie bei einem Textverarbeitungsprogramm (vertikal) |
Sie befindet sich also in einer leeren Datei vor der Position des ersten Zeichen -> 0
Am Dateiende steht sie nach dem letzten Zeichen.

2. Man stelle sich die Schreibmarke als Unterstrich vor (horizontal). X
Sie markiert die aktuelle Schreibposition. (wie in der Computersteinzeit)
In einer leeren Datei wäre das dann Position 1

Es funktionieren beide Methoden!

Die Position des datei-internen Cursors kann im Skript festgelegt werden:

starting at <Byte>

Jetzt wissen wir allerdings nicht, wie lang der Text ist, der bereits in der Datei steht. Man könnte natürlich die Zeichen zählen, aber das erledigt AppleScript wesentlich zuverlässiger für uns.

Wir fragen dazu einfach das Datei-Ende ab:

get eof RefNum

eof (end of file) gibt die Position des letzten Zeichen in der Datei an. Damit dieses Zeichen nicht überschrieben wird, wenn wir Text anhängen, setzen wir den Cursor noch um ein Zeichen weiter:

starting at ((get eof RefNum) + 1)
oder:
starting at eof (Positionszeiger steht nach dem letzten Zeichen)

Je nach dem, welche Vorstellung Sie von der Schreibmarke haben, können Sie nun folgende Paare anwenden:

Vertikale Schreibmarke | :
Dateianfang: Byte 0
Dateiende: eof

Horizontale Schreibmarke _ :
Dateianfang: Byte 1
Dateiende: ((get eof RefNum) + 1)

Da in AppleScript 1.5.5 'starting at eof' nicht richtig funktioniert, und dadurch auch die Position des letzten Zeichens markiert wird, verwende ich im Skript die zweite Methode. Unser Skript sieht nun so aus:
set RefNum to (open for access file ¬
	"Festplatte:Desktop Folder:MeineDatei" with write permission)
set Datei_Ende to (get eof RefNum) -- Datei-Ende wird abgefragt
try
write ¬
	  return & "Das ist mein Text zum Testen." & return & ¬
	  "Es könnte durchaus noch mehr sein" to RefNum ¬
           starting at Datei_Ende + 1
	close access RefNum
on error
	close access RefNum
end try
Vor den eigentlichen Text habe ich nun ein 'return' gesetzt, damit der angehängte Text in einer neuen Zeile beginnt. Dies bringt natürlich einen kleinen Schönheitsfehler mit sich, wenn die Datei noch leer war. Damit die Datei nicht mit einer Leerzeile beginnt, machen wir die Zeilenschaltung von der Datei-Ende-Position abhängig:
set RefNum to (open for access file ¬
	"Festplatte:Desktop Folder:MeineDatei" with write permission)
set Datei_Ende to (get eof RefNum)
set MeinText to ¬
	"Das ist mein Text zum Testen." & return & ¬
	"Es könnte durchaus noch mehr sein."
if Datei_Ende = 0 then
	set DateiText to MeinText
else
	set DateiText to return & MeinText
end if
try
	write DateiText to RefNum ¬
		starting at Datei_Ende + 1
	close access RefNum
on error
	close access RefNum
end try
Jetzt haben wir also erfolgreich etwas Text angehängt. Wir haben dabei gesehen, dass wir den Positionszeiger verschieben müssen, damit der vorhandene Text nicht gnadenlos überschrieben wird.

Es könnte aber auch der Fall sein, dass wir den Text wirklich überschreiben wollen. Dabei kann es aber zu nicht beabsichtigten Ergebnissen kommen, wenn der vorhandene Text länger ist als der zu schreibende Text.

Unser Text sieht bisher so aus:

Das ist mein Text zum Testen.
Es könnte durchaus noch mehr sein.

Wir wollen diesen Text durch folgenden ersetzen:

Dieser Text ist recht kurz.

Wenn wir jetzt einfach überschreiben, erhalten wir dieses Ergebnis:

Dieser Text ist recht kurz.sten.
Es könnte durchaus noch mehr sein.

Der neue Text wird ab dem Dateianfang geschrieben, jedoch bleibt der Rest des alten Textes erhalten.

Die Lösung ist ganz einfach: Wir setzen vor dem Schreibvorgang die Datei-Ende-Position auf 0 zurück. Somit ist der bisher vorhandene Text gelöscht.

set RefNum to (open for access file ¬
	"Festplatte:Desktop Folder:MeineDatei" with write permission)
set eof of RefNum to 0
set DateiText to ¬
	"Dieser Text ist recht kurz."
try
	write DateiText to RefNum
	close access RefNum
on error
	close access RefNum
end try


Weitere Möglichkeiten, die uns der write-Befehl bietet sind:

for <integer>

Hier können wir also eine bestimmte Byteanzahl festlegen, die in die Datei geschrieben werden soll.

as <type class>

Dadurch kann der Datentyp festgelegt werden (text, data, list etc.).

In AppleScript 1.5.5 macht 'as list' aber Probleme. Es kann sogar soweit führen, dass die Datei zerstört wird. Am besten ist der write-Befehl immer noch für Text geeignet.

Für andere Datentypen gibt es aber Alternativen. Doch das ist einen extra Artikel wert.



 

 

Workshop



snow@fischer-bayern.de

Ebene 1