FsiWrite
obj -> FsiWrite(var1[, int2]) : int
Dateibereich schreiben
Details
- obj: Datei-Deskriptor
- var1: Speicherquelle
- int2: Bereichsgröße (optional)
- Resultat:
intAnzahl geschriebener Zeichen oder Fehlerwert - Siehe: Verwandte Befehle ,
FsiOpen (),FsiRead (),FsiSeek (), Fehlerwerte , Beispiel
Mit dieser Funktion werden Daten in die externe Datei (obj) ab der aktuellen Positon geschrieben (siehe FsiSeek ()). In (var1) kann ein Datenbankfeld, eine Variable, ein Array oder eine Zeichenketten-Konstante angegeben werden. Arrays aus Alphafeldern sind dabei nicht zulässig. Sofern (int2) nicht angegeben ist, wird die der Größe der Variablen (var1) entsprechende Anzahl von Bytes geschrieben. Der Wert in (int2) kann daher auch nicht größer als die Variable selbst sein.
Leerzeichen am Ende eines Alphawerts bleiben erhalten. Für die Erstellung von ASCII-Dateien muss ausschließlich mit alphanumerischen Werten gearbeitet werden. Andere Feldtypen müssen in der Prozedur entsprechend umgewandelt werden.
Beim Schreiben werden die Zeichenketten standardmäßig von der internen Zeichencodierung in die OEM-Zeichencodierung gewandelt. Durch entsprechende Angaben bei der Anweisung FsiOpen () kann eine andere Wandlung vorgenommen oder die Wandlung verhindert werden.
Sollen in eine externe Datei Nullen geschrieben werden, kann dafür keine Zeichenkette verwendet werden. Statt dessen kann zum Beispiel ein Array vom Typ byte verwendet werden. Da immer das gesamte Array geschrieben wird, werden auch die auf Null gesetzten Zellen geschrieben.
Das Resultat gibt die Anzahl der geschrieben Bytes zurück. Ist das Resultat negativ ist ein Fehler aufgetreten und das Resultat enthält den Fehlerwert (_ErrFsi...). Der Fehlerwert des Betriebssystems kann über die Eigenschaft FsiError abgefragt werden.
Beispiel:
// Kopieren einer Datei
define
{
sMem : _Mem8K // 8 Kilobytes
}
sub FsiCopy
(
aSrcName : alpha; // Name der Ausgangsdatei
aDstName : alpha; // Name der Zieldatei
aMove : logic; // Originaldatei löschen
) : int; // Fehlerwert
local
{
tSrcHdl : int; // Deskriptor der Ausgangsdatei
tDstHdl : int; // Deskriptor der Zieldatei
tSize : int; // Größe der Originaldatei
tBlockSize : int; // Blockgröße
tBuffer : byte[sMem]; // Datenpuffer
tResult : int; // Funktionsresultat
}
{
try
{
// Dateien öffnen und Größe ermitteln
tSrcHdl # FsiOpen(aSrcName, _FsiStdRead);
tDstHdl # FsiOpen(aDstName, _FsiStdWrite);
tSize # FsiSize(tSrcHdl);
// kopieren
while (tSize > 0)
{
tBlockSize # Min(tSize, sMem); // maximale Blockgröße setzen
tSrcHdl->FsiRead(tBuffer, tBlockSize); // Daten lesen
tDstHdl->FsiWrite(tBuffer, tBlockSize); // Daten schreiben
Dec(tSize, tBlockSize); // Restgröße vermindern
}
// Datum & Uhrzeit wiederherstellen
tDstHdl->FsiDate(_FsiDtModified, FsiDate(tSrcHdl, _FsiDtModified));
tDstHdl->FsiTime(_FsiDtModified, FsiTime(tSrcHdl, _FsiDtModified));
}
// Fehler aufgetreten?
tResult # ErrGet();
ErrSet(0);
// Dateien schließen, wenn Handles belegt
if (tDstHdl > 0)
tDstHdl->FsiClose();
if (tSrcHdl > 0)
tSrcHdl->FsiClose();
// Originaldatei löschen
if (aMove)
tResult # FsiDelete(aSrcName);
return(tResult);
}
Mögliche Laufzeitfehler:
_ErrHdlInvalid: Datei-Deskriptor (obj) ungültig