Unidades | | | |  | El erste Versión meiner FileClass-Unit es fertig
Bitte no con el File-Unit verwechseln
Bisher Es el Auswahl a Klassen para XProfan sí todavía una bißchen dürftig, por lo tanto (y natürlich de persönlichen Interesse) tener Yo mich entschlossen una FileClass a redactar. Diese Klasse kann fast cualquier viele Archivos gleichzeitig redactar, bearbeiten oder lesen (unabhängig de los Profano-internen Befehlen). Alle Métodos (Características en el Klasse) beruhen en reinem Windows-API. Un direkte Unterscheidung de Binär- y Textdateien no existe. El Syntax es auch muy simplemente. Im beiligendem Source son todos Métodos ausführlich beschrieben, desweiteren Yo 3 Beispiele beigefügt, el una Einstieg erleichtern debería. El Unit se, Yo hoffe en efecto en una bißchen Teamwork, todavía se ampliará. Einschränkungen a Tiempo: Fehlerbehandlung todavía Stiefmütterlich  Geschwindigkeit en Zeilenweise einlesen de Texten no tan besonders (bisher es todavía no Pufferung instalado).
Dateisystemfunktionen, also redactar de Ordnern, ermitteln de Pfaden usw. son no geplant. El Klasse se lediglich Dateioperationen ausführen. Selbstverständlich puede ser später auch separat una FileSystemClass redactar, el en Bedarf de dieser Klasse erbt
Saludo Thomas (ts-soft)
$L
$H windows.ph
{
Class ?_File = -hFile&,
-FileError&,
+Error@,
+Cerrar@,
+Crear@,
+Eof@,
+Seek@,
+Loc@,
+Lof@,
+Open@,
+Read@,
+GetFile@,
+GetByte@,
+GetWord@,
+GetLong@,
+GetFloat@,
+GetString@,
+GetData@,
+PutByte@,
+PutWord@,
+PutLong@,
+PutFloat@,
+PutString@,
+PutStringCR@,
+PutData@,
+Versión@
}
################################################
# Erstellen, öffnen y schliessen de Archivos #
################################################
Syntax: OBJEKT#.Crear(FileName$)
Ergebnis: Handle des Files,
en el Fehlerfall -1, OBJEKT#.Error se en TRUE gesetzt
Erklärung: Öffnet una vacío Expediente. Existiert el angegebene Expediente ya,
se esta geöffnet y por una vacío ersetzt!!!
Proc ?_File.Crear
Parámetros FileName$
.FileError& = 0
{
.hFile& = ~CreateFile(Addr(FileName$),
O(~GENERIC_WRITE,~GENERIC_READ),
0,
0,
~CREATE_ALWAYS,
~FILE_ATTRIBUTE_NORMAL,
0)
}
Case .hFile& = ~INVALID_HANDLE_VALUE : .FileError& = 1
Volver .hFile&
ENDPROC
Syntax: OBJEKT#.Open(FileName$)
Ergebnis: Handle des Files,
en el Fehlerfall -1, OBJEKT#.Error se en TRUE gesetzt
Erklärung: Öffnet el angegebene Expediente oder erstellt una,
si todavía no existiert. Usted kannst nun Lese- y Schreibfunktionen en dieser Expediente ausführen
Proc ?_File.Open
Parámetros FileName$
.FileError& = 0
{
.hFile& = ~CreateFile(Addr(FileName$),
O(~GENERIC_WRITE, ~GENERIC_READ),
~FILE_SHARE_READ | ~FILE_SHARE_WRITE,
0,
~OPEN_ALWAYS,
~FILE_ATTRIBUTE_NORMAL,
0)
}
Case .hFile& = ~INVALID_HANDLE_VALUE : .FileError& = 1
Volver .hFile&
ENDPROC
Syntax: OBJEKT#.Read(FileName$)
Ergebnis: Handle des Files,
en el Fehlerfall -1, OBJEKT#.Error se en TRUE gesetzt
Erklärung: Öffnet una existierende Expediente FileName$ ausschließlich para Lese-Operationen
Proc ?_File.Read
Parámetros FileName$
.FileError& = 0
{
.hFile& = ~CreateFile(Addr(FileName$),
~GENERIC_READ,
~FILE_SHARE_READ,
0,
~OPEN_EXISTING,
~FILE_ATTRIBUTE_NORMAL,
0)
}
Case .hFile& = ~INVALID_HANDLE_VALUE : .FileError& = 1
Volver .hFile&
ENDPROC
Syntax: OBJEKT#.Cerrar([File&])
Ergebnis: keins
Erklärung: Schließt el aktuelle Expediente, welche así no más benutzt voluntad kann
Wenn el optionale Parámetro File& übergeben se, se esta Expediente geschlossen, el
aktuelle Expediente restos hiervon unbeeinflusst
Proc ?_File.Cerrar
If %PCount = 1
Parámetros file&
~CloseHandle(file&)
Más
~CloseHandle(.hFile&)
.hFile& = 0
EndIf
ENDPROC
###############
# Daten lesen #
###############
Syntax: OBJEKT#.GetByte()
Ergebnis: gelesenes Byte
Erklärung: Liest una Byte de el aktuell geöffneten Expediente una
Proc ?_File.GetByte
Declarar temp1&, temp2#
Dim temp2#, 1
~ReadFile(.hFile&, Addr(temp1&), 1, Addr(temp2#), 0)
Disponer temp2#
Volver temp1&
ENDPROC
Syntax: OBJEKT#.GetWord()
Ergebnis: gelesenes Word
Erklärung: Liest una Word de el aktuell geöffneten Expediente una
Proc ?_File.GetWord
Declarar temp1&, temp2#
Dim temp2#, 2
~ReadFile(.hFile&, Addr(temp1&), 2, Addr(temp2#), 0)
Disponer temp2#
Volver temp1&
ENDPROC
Syntax: OBJEKT#.GetLong()
Ergebnis: gelesenes Long&
Erklärung: Liest una Largo de el aktuell geöffneten Expediente una
Proc ?_File.GetLong
Declarar temp1&, temp2&
~ReadFile(.hFile&, Addr(temp1&), 4, Addr(temp2&), 0)
Volver temp1&
ENDPROC
Syntax: OBJEKT#.GetFloat()
Ergebnis: gelesenes Float!
Erklärung: Liest una Float de el aktuell geöffneten Expediente una
Proc ?_File.GetFloat
Declarar temp1!, temp2#
Dim temp2#, 8
~ReadFile(.hFile&, Addr(temp1!), 8, Addr(temp2#), 0)
Disponer temp2#
Volver temp1!
ENDPROC
Syntax: OBJEKT#.GetString()
Ergebnis: gelesene TextZeile como Texto$
Erklärung: Liest una String de el aktuell geöffneten Expediente,
a una End Of Line Signo gefunden es. UNIX oder DOS
Proc ?_File.GetString
Declarar buffer#, bytesread&, Texto$
Dim buffer#, 1
Mientras que ~SetFilePointer(.hfile&, 0, 0, ~FILE_CURRENT) < ~GetFileSize(.hfile&, 0)
~ReadFile(.hfile&, Addr(buffer#), 1, Addr(bytesread&), 0)
Case Byte(buffer#,0) = 0 : romper
Case Byte(buffer#,0) = 10 : romper
Texto$ = Texto$ + Chr$(Byte(buffer#,0))
EndWhile
Disponer buffer#
Volver Translate$(Texto$, Chr$(13), "")
ENDPROC
Syntax: OBJEKT#.GetData(MemoryBuffer&, LengthToRead&)
Ergebnis: keins (gelesene Bytes befinden se en el MemoryBuffer&)
Descripción: Liest el Inhalt el aktuellen Expediente con el
angegebenen Longitud LengthToRead& (Anzahl a einzulesender Signo)
en el angegebenen Speicherbereich MemoryBuffer& por ejemplo Adresse
uno Bereichsvariable
Proc ?_File.GetData
Parámetros MemoryBuffer&, LengthToRead&
Declarar buffer#
Dim buffer#, LengthToRead&
~ReadFile(.hFile&, MemoryBuffer&, LengthToRead&, Addr(buffer#), 0)
Disponer buffer#
ENDPROC
###################
# Daten escribir #
###################
El hier folgenden Métodos trabajo sólo,
si el Expediente con Schreib-Unterstützung geöffnet wurde
(entweder con Crear oder Open)
Syntax: OBJEKT#.PutByte(Wert&)
Ergebnis: keins
Erklärung: Escribe una Byte-Valor en el aktuelle Expediente.
Proc ?_File.PutByte
Parámetros Number&
Declarar Temp#
Dim Temp#, 1
~WriteFile(.hFile&, Addr(Number&), 1, Temp#, 0)
Disponer Temp#
ENDPROC
Syntax: OBJEKT#.PutWord(Wert&)
Ergebnis: keins
Erklärung: Escribe una Word-Valor en el aktuelle Expediente.
Proc ?_File.PutWord
Parámetros Number&
Declarar Temp#
Dim Temp#, 2
~WriteFile(.hFile&, Addr(Number&), 2, Temp#, 0)
Disponer Temp#
ENDPROC
Syntax: OBJEKT#.PutLong(Wert&)
Ergebnis: keins
Erklärung: Escribe una Largo-Valor en el aktuelle Expediente.
Proc ?_File.PutLong
Parámetros Number&
Declarar Temp&
~WriteFile(.hFile&, Addr(Number&), 4, Addr(Temp&), 0)
ENDPROC
Syntax: OBJEKT#.PutFloat(Valor!)
Ergebnis: keins
Erklärung: Escribe una Float-Valor en el aktuelle Expediente.
Proc ?_File.PutFloat
Parámetros Number!
Declarar Temp!
~WriteFile(.hFile&, Addr(Number!), 8, Addr(Temp!), 0)
ENDPROC
Syntax: OBJEKT#.PutString(Texto$)
Ergebnis: keins
Erklärung: Escribe una String en el aktuelle Expediente
Proc ?_File.PutString
Parámetros Texto$
Declarar Temp#
Dim Temp#, Len(Texto$)
~WriteFile(.hFile&, Addr(Texto$), Len(Texto$), Addr(Temp#), 0)
Disponer Temp#
ENDPROC
Syntax: OBJEKT#.PutStringCR(Texto$)
Ergebnis: keins
Erklärung: Escribe una String en el aktuelle Expediente
y fügt una EOL Zeilenumbruch hinzu
Proc ?_File.PutStringCR
Parámetros Texto$
Declarar Temp#
Texto$ = Texto$ + Chr$(13) + Chr$(10)
Dim Temp#, Len(Texto$)
~WriteFile(.hFile&, Addr(Texto$), Len(Texto$), Addr(Temp#), 0)
Disponer Temp#
ENDPROC
Syntax: OBJEKT#.PutData(MemoryBuffer&, LengthToWrite&)
Ergebnis: keins
Erklärung: Escribe el Inhalt des angegebenen Speicherbereichs
MemoryBuffer& con uno Longitud de LengthToWrite& en el aktuelle Expediente.
Proc ?_File.PutData
Parámetros MemoryBuffer&, LengthToWrite&
Declarar buffer#
Dim buffer#, LengthToWrite&
~WriteFile(.hFile&, MemoryBuffer&, LengthToWrite&, Addr(buffer#), 0)
Disponer buffer#
ENDPROC
############
# Diverses #
############
Syntax: OBJEKT#.Error()
Ergebnis: 0 oder 1
Erklärung: Gibt en el Fehlerfall True (1) zurück
Z. Zt. se sólo en ~INVALID_HANDLE_VALUE en
OBJEKT#.Crear(), OBJEKT#.Open() y OBJEKT#.Read() geprüft
Proc ?_File.Error
Volver .FileError&
ENDPROC
Syntax: OBJEKT#.GetFile()
Ergebnis: Handle des Files
Erklärung: Hiermit kann auch nachträglich el
Handle el aktuellen Expediente ermittelt voluntad
Proc ?_File.GetFile
Volver .hFile&
ENDPROC
Syntax: OBJEKT#.Eof()
Ergebnis: 0 oder 1
Erklärung: Hiermit ermitteln wir si el Ende el
Expediente erreicht wurde (1) oder no (0)
Proc ?_File.Eof
Declarar Result&
If ~SetFilePointer(.hFile&, 0, 0, ~FILE_CURRENT) < ~GetFileSize(.hFile&, 0)
Result& = 0
Más
Result& = 1
EndIf
Volver Result&
ENDPROC
Syntax: OBJEKT#.Loc()
Ergebnis: Position
Erklärung: Gibt el aktuelle Zeiger-Position
innerhalb el Expediente zurück
Proc ?_File.Loc
Volver ~SetFilePointer(.hFile&, 0, 0, ~FILE_CURRENT)
ENDPROC
Syntax: OBJEKT#.Seek(NewPosition&)
Ergebnis:
Descripción: Ändert el Lese/Schreib - Zeiger innerhalb
el Expediente en el angegebene NeuePosition. Dieser
Parámetro muss en Bytes angegeben voluntad
Proc ?_File.Seek
Parámetros NewPosition&
Volver ~SetFilePointer(.hFile&, NewPosition&, 0, ~FILE_BEGIN)
ENDPROC
Syntax: OBJEKT#.Lof()
Ergebnis: FileSize
Erklärung: LOF es para Length Of File (Longitud el Expediente).
Lo son el Longitud el aktuellen Expediente zurück
Proc ?_File.Lof
Volver ~GetFileSize(.hFile&, 0)
ENDPROC
Syntax: OBJEKT#.Versión()
Ergebnis: Versión
Erklärung: Gibt el aktuelle Versión
dieser Klasse como String otra vez
Proc ?_File.Versión
Volver "0.5.5.18" Haupt-Versión.Jahr.Monat.Tag
ENDPROC
|
 | | | | |
| |  | Hab el Unit veces geupdatet.
OBJEKT#.UseFile(hFile&) wurde lejos. Machte desafortunadamente teilweise Problemas. Um mehrere Archivos a nutzen, es ahora erforderlich para jede Expediente una neue Instanz el Klasse anzulegen. Erhöht zwar algo el Schreibaufwand, pero es trotzdem weiterhin posible fast cualquier viel Archivos gleichzeitig a bearbeiten. Das Ejemplo test3.prf wurde darauf angepaßt y igual todavía fehlerbereinigt. En vorigen Versión, son me en mi Sistema no Fehler aufgefallen, lediglich Rolf teilte me esta con. Habs en efecto hoffentlich ahora beseitigt. Yo bin also el Testen de euch angewiesen.
Saludo Thomas |
| | | | |
| |  | Habs kurz getestet y funzt bien.
En me also Fehlerfrei.
Um no el número el Downloads cada veces en una Actualización sobre 0 a conjunto - nutze doch sólo el Durchsuchen Knopf - y luego klicke en neue Versión.
Salve. |
| | | | |
| |  | Hola Thomas...
Bin desafortunadamente (todavía) kein XProfan Nutzer, deshalb voluntad Yo sólo veces auch no testen. Bezogen en ~Generic_write | ~Generic_read podría dir aber como una Profanbug evtl. veces algo Problemas bereiten. Schau veces en Bugnity después de... |
| | | | |
| |  | [quote:1382f2518b=iF]Habs kurz getestet y funzt bien.
En me also Fehlerfrei.[/quote:1382f2518b]Das Freud mich primero  [quote:1382f2518b=iF] Um no el número el Downloads cada veces en una Actualización sobre 0 a conjunto - nutze doch sólo el Durchsuchen Knopf - y luego klicke en neue Versión.
Salve.[/quote:1382f2518b] Habs wohl ya otra vez verkehrt gemacht 
[quote:1382f2518b=AH]Schau veces en Bugnity después de... [/quote:1382f2518b]Hab el entsprechenden Stellen con O angepaßt 
Saludo Thomas |
| | | | |
| |  Rolf Koch | Hi Thomas,
sí lo va ahora!
Rolf |
| | | | |
| |  | [quote:5439b97a2c]Schon otra vez falso gemacht[/quote:5439b97a2c]Gehe doch simplemente veces en el Arena - hay puede ser testen así viel uno möchte. 
Salve. |
| | | | |
| |  Michael Wodrich | Nachfolgend una Función con Blockpuffer.
Proc ?_file.getstring
Declarar Buffer#, Bytesread&, Texto$, Texto2$, FSize&, aktPos&, found&
Dim Buffer#, 1024
FSize& = ~Getfilesize(.Hfile&, 0)
aktPos& = ~Setfilepointer(.Hfile&, 0, 0, ~File_current)
Mientras que aktPos& < FSize&
~Readfile(.Hfile&, Addr(Buffer#), 1024, Addr(Bytesread&), 0)
Found& = MemPos(Buffer#,0,Chr$(0))
If Found& <> -1
Texto2$ = String$(Buffer#,0)
Texto$ = Texto$ + Texto2$
aktPos& = aktPos& + Len(Texto2$) + 1
~Setfilepointer(.Hfile&, aktPos&, 0, ~File_Begin)
Romper
EndIf
Found& = MemPos(Buffer#,0,Chr$(10))
If Found& <> -1
Texto2$ = Char$(Buffer#,0,Found&)
Texto$ = Texto$ + Texto2$
aktPos& = aktPos& + Len(Texto2$) + 1
~Setfilepointer(.Hfile&, aktPos&, 0, ~File_Begin)
Romper
EndIf
aktPos& = ~Setfilepointer(.Hfile&, 0, 0, ~File_current)
Endwhile
Disponer Buffer#
Volver Translate$(Texto$, Chr$(13), "")
ENDPROC
|
| | | Programmieren, das spannendste Detektivspiel der Welt. | 23.12.2005 ▲ |
| |
| |  | Schön, el se todavía uno para esta Unit-Interessiert  Tal vez debería uno el Buffer en 4096 erhöhen, sólo de el Grunde, porque el Valor en otro me bekannten Características auch genommen se. Yo denke veces el se kein Zufall ser.
Frohe Weihnacht |
| | | | |
|
RespuestaThemeninformationenDieses Thema ha 4 subscriber: |