Unités | | | |  | la première Version meiner FileClass-Unit ist fertig
s'il te plaît pas avec qui File-Unit verwechseln
Bisher ist qui sélection à Klassen pour XProfan oui encore légèrement dürftig, daher (et naturellement aus personnel intérêt) hab je mich entschlossen une FileClass trop erstellen. cet super peux presque beliebig viele Fichiers gleichzeitig erstellen, Travailler ou bien lesen (indépendant de den Profan-internen Befehlen). Alle Methoden (Funktionen dans qui super) beruhen sur reinem Windows-API. une directe Unterscheidung de Binär- et Textdateien gibt es pas. qui Syntax ist aussi très simple. Im beiligendem Source sommes alle Methoden en détails beschrieben, desweiteren habe je 3 Beispiele beigefügt, qui une Einstieg erleichtern devrait. qui Unit soll, je hoffe oui aussi sur légèrement Teamwork, encore plus étendu volonté. Einschränkungen zur Zeit: Fehlerbehandlung encore Stiefmütterlich  Geschwindigkeit chez Zeilenweise einlesen de Texten encore pas so besonders (bisher ist encore aucun Pufferung incorporé).
Dateisystemfunktionen, alors erstellen de Ordnern, ermitteln de Pfaden usw. sommes pas geplant. qui super soll lediglich Dateioperationen effectuer. bien sûr peux on später aussi separat une FileSystemClass erstellen, qui chez besoin de cette super erbt
Salut Thomas (ts-soft)
$L
$H windows.ph
{
Class ?_File = -hFile&,
-FileError&,
+Error@,
+Fermer@,
+Créer@,
+Eof@,
+Seek@,
+Loc@,
+Lof@,
+Open@,
+Read@,
+GetFile@,
+GetByte@,
+GetWord@,
+GetLong@,
+GetFloat@,
+GetString@,
+GetData@,
+PutByte@,
+PutWord@,
+PutLong@,
+PutFloat@,
+PutString@,
+PutStringCR@,
+PutData@,
+Version@
}
################################################
# Erstellen, öffnen et schliessen de Fichiers #
################################################
Syntax: OBJEKT#.Créer(FileName$)
Ergebnis: Handle des Files,
im Fehlerfall -1, OBJEKT#.Error wird sur TRUE gesetzt
Erklärung: Öffnet une le vide Dossier. Existiert qui angegebene Dossier bereits,
wird cet ouvert et par une le vide ersetzt!!!
Proc ?_File.Créer
Paramètres FileName$
.FileError& = 0
{
.hFile& = ~CreateFile(Addr(FileName$),
OU(~GENERIC_WRITE,~GENERIC_READ),
0,
0,
~CREATE_ALWAYS,
~FILE_ATTRIBUTE_NORMAL,
0)
}
Cas .hFile& = ~INVALID_HANDLE_VALUE : .FileError& = 1
Retour .hFile&
ENDPROC
Syntax: OBJEKT#.Open(FileName$)
Ergebnis: Handle des Files,
im Fehlerfall -1, OBJEKT#.Error wird sur TRUE gesetzt
Erklärung: Öffnet qui angegebene Dossier ou bien erstellt une,
si encore aucun existiert. Du peux eh bien Lese- et Schreibfunktionen dans cette Dossier effectuer
Proc ?_File.Open
Paramètres FileName$
.FileError& = 0
{
.hFile& = ~CreateFile(Addr(FileName$),
OU(~GENERIC_WRITE, ~GENERIC_READ),
~FILE_SHARE_READ | ~FILE_SHARE_WRITE,
0,
~OPEN_ALWAYS,
~FILE_ATTRIBUTE_NORMAL,
0)
}
Cas .hFile& = ~INVALID_HANDLE_VALUE : .FileError& = 1
Retour .hFile&
ENDPROC
Syntax: OBJEKT#.Read(FileName$)
Ergebnis: Handle des Files,
im Fehlerfall -1, OBJEKT#.Error wird sur TRUE gesetzt
Erklärung: Öffnet une existierende Dossier FileName$ ausschließlich pour Lese-Operationen
Proc ?_File.Read
Paramètres FileName$
.FileError& = 0
{
.hFile& = ~CreateFile(Addr(FileName$),
~GENERIC_READ,
~FILE_SHARE_READ,
0,
~OPEN_EXISTING,
~FILE_ATTRIBUTE_NORMAL,
0)
}
Cas .hFile& = ~INVALID_HANDLE_VALUE : .FileError& = 1
Retour .hFile&
ENDPROC
Syntax: OBJEKT#.Fermer([File&])
Ergebnis: keins
Erklärung: Schließt qui aktuelle Dossier, quelle avec cela pas plus benutzt volonté peux
si qui optionale paramètre File& übergeben wird, wird cet Dossier geschlossen, qui
aktuelle Dossier bleibt hiervon unbeeinflusst
Proc ?_File.Fermer
Si %PCount = 1
Paramètres file&
~CloseHandle(file&)
D'autre
~CloseHandle(.hFile&)
.hFile& = 0
EndIf
ENDPROC
###############
# données lesen #
###############
Syntax: OBJEKT#.GetByte()
Ergebnis: gelesenes Byte
Erklärung: Liest un Byte aus qui aktuell geöffneten Dossier un
Proc ?_File.GetByte
Déclarer temp1&, temp2#
Faible temp2#, 1
~ReadFile(.hFile&, Addr(temp1&), 1, Addr(temp2#), 0)
Dispose temp2#
Retour temp1&
ENDPROC
Syntax: OBJEKT#.GetWord()
Ergebnis: gelesenes Word
Erklärung: Liest un Word aus qui aktuell geöffneten Dossier un
Proc ?_File.GetWord
Déclarer temp1&, temp2#
Faible temp2#, 2
~ReadFile(.hFile&, Addr(temp1&), 2, Addr(temp2#), 0)
Dispose temp2#
Retour temp1&
ENDPROC
Syntax: OBJEKT#.GetLong()
Ergebnis: gelesenes Long&
Erklärung: Liest un Long aus qui aktuell geöffneten Dossier un
Proc ?_File.GetLong
Déclarer temp1&, temp2&
~ReadFile(.hFile&, Addr(temp1&), 4, Addr(temp2&), 0)
Retour temp1&
ENDPROC
Syntax: OBJEKT#.GetFloat()
Ergebnis: gelesenes Float!
Erklärung: Liest un Float aus qui aktuell geöffneten Dossier un
Proc ?_File.GetFloat
Déclarer temp1!, temp2#
Faible temp2#, 8
~ReadFile(.hFile&, Addr(temp1!), 8, Addr(temp2#), 0)
Dispose temp2#
Retour temp1!
ENDPROC
Syntax: OBJEKT#.GetString()
Ergebnis: gelesene TextZeile comme Text$
Erklärung: Liest une String aus qui aktuell geöffneten Dossier,
jusqu'à un Fin Of Line marque trouvé wird. UNIX ou bien DOS
Proc ?_File.GetString
Déclarer buffer#, bytesread&, Text$
Faible buffer#, 1
Tandis que ~SetFilePointer(.hfile&, 0, 0, ~FILE_CURRENT) < ~GetFileSize(.hfile&, 0)
~ReadFile(.hfile&, Addr(buffer#), 1, Addr(bytesread&), 0)
Cas Byte(buffer#,0) = 0 : pause
Cas Byte(buffer#,0) = 10 : pause
Text$ = Text$ + Chr$(Byte(buffer#,0))
Endwhile
Dispose buffer#
Retour Translate$(Text$, Chr$(13), »)
ENDPROC
Syntax: OBJEKT#.GetData(MemoryBuffer&, LengthToRead&)
Ergebnis: keins (gelesene Bytes befinden sich im MemoryBuffer&)
Beschreibung: Liest den le contenu qui aktuellen Dossier avec qui
angegebenen Longueur LengthToRead& (Anzahl trop einzulesender marque)
dans den angegebenen Speicherbereich MemoryBuffer& z.B. Adresse
einer Bereichsvariable
Proc ?_File.GetData
Paramètres MemoryBuffer&, LengthToRead&
Déclarer buffer#
Faible buffer#, LengthToRead&
~ReadFile(.hFile&, MemoryBuffer&, LengthToRead&, Addr(buffer#), 0)
Dispose buffer#
ENDPROC
###################
# données écrivons #
###################
qui ici folgenden Methoden marcher seulement,
si qui Dossier avec Schreib-Unterstützung ouvert wurde
(entweder avec Créer ou bien Open)
Syntax: OBJEKT#.PutByte(Wert&)
Ergebnis: keins
Erklärung: écrit une Byte-Wert dans qui aktuelle Dossier.
Proc ?_File.PutByte
Paramètres Number&
Déclarer Temp#
Faible Temp#, 1
~WriteFile(.hFile&, Addr(Number&), 1, Temp#, 0)
Dispose Temp#
ENDPROC
Syntax: OBJEKT#.PutWord(Wert&)
Ergebnis: keins
Erklärung: écrit une Word-Wert dans qui aktuelle Dossier.
Proc ?_File.PutWord
Paramètres Number&
Déclarer Temp#
Faible Temp#, 2
~WriteFile(.hFile&, Addr(Number&), 2, Temp#, 0)
Dispose Temp#
ENDPROC
Syntax: OBJEKT#.PutLong(Wert&)
Ergebnis: keins
Erklärung: écrit une Long-Wert dans qui aktuelle Dossier.
Proc ?_File.PutLong
Paramètres Number&
Déclarer Temp&
~WriteFile(.hFile&, Addr(Number&), 4, Addr(Temp&), 0)
ENDPROC
Syntax: OBJEKT#.PutFloat(Wert!)
Ergebnis: keins
Erklärung: écrit une Float-Wert dans qui aktuelle Dossier.
Proc ?_File.PutFloat
Paramètres Number!
Déclarer Temp!
~WriteFile(.hFile&, Addr(Number!), 8, Addr(Temp!), 0)
ENDPROC
Syntax: OBJEKT#.PutString(Text$)
Ergebnis: keins
Erklärung: écrit une String dans qui aktuelle Dossier
Proc ?_File.PutString
Paramètres Text$
Déclarer Temp#
Faible Temp#, Len(Text$)
~WriteFile(.hFile&, Addr(Text$), Len(Text$), Addr(Temp#), 0)
Dispose Temp#
ENDPROC
Syntax: OBJEKT#.PutStringCR(Text$)
Ergebnis: keins
Erklärung: écrit une String dans qui aktuelle Dossier
et fügt un EOL Zeilenumbruch hinzu
Proc ?_File.PutStringCR
Paramètres Text$
Déclarer Temp#
Text$ = Text$ + Chr$(13) + Chr$(10)
Faible Temp#, Len(Text$)
~WriteFile(.hFile&, Addr(Text$), Len(Text$), Addr(Temp#), 0)
Dispose Temp#
ENDPROC
Syntax: OBJEKT#.PutData(MemoryBuffer&, LengthToWrite&)
Ergebnis: keins
Erklärung: écrit den le contenu des angegebenen Speicherbereichs
MemoryBuffer& avec einer Longueur de LengthToWrite& dans qui aktuelle Dossier.
Proc ?_File.PutData
Paramètres MemoryBuffer&, LengthToWrite&
Déclarer buffer#
Faible buffer#, LengthToWrite&
~WriteFile(.hFile&, MemoryBuffer&, LengthToWrite&, Addr(buffer#), 0)
Dispose buffer#
ENDPROC
############
# Diverses #
############
Syntax: OBJEKT#.Error()
Ergebnis: 0 ou bien 1
Erklärung: Gibt im Fehlerfall True (1) zurück
Z. Zt. wird seulement sur ~INVALID_HANDLE_VALUE chez
OBJEKT#.Créer(), OBJEKT#.Open() et OBJEKT#.Read() geprüft
Proc ?_File.Error
Retour .FileError&
ENDPROC
Syntax: OBJEKT#.GetFile()
Ergebnis: Handle des Files
Erklärung: Hiermit peux aussi nachträglich cela
Handle qui aktuellen Dossier ermittelt volonté
Proc ?_File.GetFile
Retour .hFile&
ENDPROC
Syntax: OBJEKT#.Eof()
Ergebnis: 0 ou bien 1
Erklärung: Hiermit ermitteln wir si cela Ende qui
Dossier erreicht wurde (1) ou bien pas (0)
Proc ?_File.Eof
Déclarer Result&
Si ~SetFilePointer(.hFile&, 0, 0, ~FILE_CURRENT) < ~GetFileSize(.hFile&, 0)
Result& = 0
D'autre
Result& = 1
EndIf
Retour Result&
ENDPROC
Syntax: OBJEKT#.Loc()
Ergebnis: Position
Erklärung: Gibt qui aktuelle aiguille-Position
dedans qui Dossier zurück
Proc ?_File.Loc
Retour ~SetFilePointer(.hFile&, 0, 0, ~FILE_CURRENT)
ENDPROC
Syntax: OBJEKT#.Seek(NewPosition&)
Ergebnis:
Beschreibung: Ändert den Lese/Schreib - aiguille dedans
qui Dossier sur qui angegebene NeuePosition. cette
paramètre muss dans Bytes angegeben volonté
Proc ?_File.Seek
Paramètres NewPosition&
Retour ~SetFilePointer(.hFile&, NewPosition&, 0, ~FILE_BEGIN)
ENDPROC
Syntax: OBJEKT#.Lof()
Ergebnis: FileSize
Erklärung: LOF steht pour Length Of File (Longueur qui Dossier).
Es gibt qui Longueur qui aktuellen Dossier zurück
Proc ?_File.Lof
Retour ~GetFileSize(.hFile&, 0)
ENDPROC
Syntax: OBJEKT#.Version()
Ergebnis: Version
Erklärung: Gibt qui aktuelle Version
cette super comme String wieder
Proc ?_File.Version
Retour "0.5.5.18" tête-Version.l'an.mois.journée
ENDPROC
|
 | | | | |
| |  | Hab qui Unit la fois geupdatet.
OBJEKT#.UseFile(hFile&) wurde entfernt. Machte malheureusement partiellement Probleme. Um plusieurs Fichiers trop nutzen, ist es maintenant erforderlich pour chacun Dossier une neue Instanz qui super anzulegen. Erhöht zwar quelque chose den Schreibaufwand, mais c'est quand même weiterhin possible presque beliebig viel Fichiers gleichzeitig trop Travailler. cela Beispiel test3.prf wurde puis ajusté et juste encore fehlerbereinigt. chez qui vorigen Version, sommes mir sur meinem System aucun faute aufgefallen, lediglich Rolf teilte mir cet avec. Tricolore oui aussi hoffentlich maintenant beseitigt. je suis alors sur cela Testen de euch angewiesen.
Salut Thomas |
| | | | |
| |  | Tricolore kurz getestet et funzt bien.
chez mir alors correct.
Um pas le nombre qui Downloads chaque la fois chez einem Update sur 0 trop mettons - nutze doch seulement den fouiller Knopf - et ensuite klicke sur neue Version.
Salve. |
| | | | |
| |  | allô Thomas...
suis malheureusement (encore) ne...aucune XProfan Nutzer, c'est pourquoi werde je seulement la fois aussi pas testen. Bezogen sur ~Generic_write | ~Generic_read pourrait dir mais là un Profanbug peut-être. la fois quelque chose Probleme bereiten. exposition la fois dans Bugnity pour... |
| | | | |
| |  | [quote-part:1382f2518b=iF]Tricolore kurz getestet et funzt bien.
chez mir alors correct.[/quote-part:1382f2518b]cela Freud mich erstmal  [quote-part:1382f2518b=iF] Um pas le nombre qui Downloads chaque la fois chez einem Update sur 0 trop mettons - nutze doch seulement den fouiller Knopf - et ensuite klicke sur neue Version.
Salve.[/quote-part:1382f2518b] Tricolore wohl encore verkehrt gemacht 
[quote-part:1382f2518b=AH]exposition la fois dans Bugnity pour... [/quote-part:1382f2518b]Hab qui entsprechenden se mettre avec OU ajusté 
Salut Thomas |
| | | | |
| |  Rolf Koch | Hi Thomas,
oui und dir maintenant!
Rolf |
| | | | |
| |  | [quote-part:5439b97a2c]encore faux gemacht[/quote-part:5439b97a2c]vais doch simple la fois dans l'arène - là peux on testen so viel on voudrais. 
Salve. |
| | | | |
| |  Michael Wodrich | Nachfolgend une Funktion avec Blockpuffer.
Proc ?_file.getstring
Déclarer Buffer#, Bytesread&, Text$, Text2$, FSize&, aktPos&, found&
Faible Buffer#, 1024
FSize& = ~Getfilesize(.Hfile&, 0)
aktPos& = ~Setfilepointer(.Hfile&, 0, 0, ~File_current)
Tandis que aktPos& < FSize&
~Readfile(.Hfile&, Addr(Buffer#), 1024, Addr(Bytesread&), 0)
Found& = MemPos(Buffer#,0,Chr$(0))
Si Found& <> -1
Text2$ = String$(Buffer#,0)
Text$ = Text$ + Text2$
aktPos& = aktPos& + Len(Text2$) + 1
~Setfilepointer(.Hfile&, aktPos&, 0, ~File_Begin)
Pause
EndIf
Found& = MemPos(Buffer#,0,Chr$(10))
Si Found& <> -1
Text2$ = Char$(Buffer#,0,Found&)
Text$ = Text$ + Text2$
aktPos& = aktPos& + Len(Text2$) + 1
~Setfilepointer(.Hfile&, aktPos&, 0, ~File_Begin)
Pause
EndIf
aktPos& = ~Setfilepointer(.Hfile&, 0, 0, ~File_current)
Endwhile
Dispose Buffer#
Retour Translate$(Text$, Chr$(13), »)
ENDPROC
|
| | | Programmieren, das spannendste Detektivspiel der Welt. | 23.12.2005 ▲ |
| |
| |  | joli, cela sich doch encore einer pour cet Unit-intéressé  peut-être sollte on den Buffer sur 4096 erhöhen, seulement aus dem Grunde, weil qui Wert dans anderen mir bekannten Funktionen aussi pris wird. je denke la fois cela wird ne...aucune Zufall son.
Frohe Weihnacht |
| | | | |
|
répondreOptions du sujet | 7.601 Views |
Themeninformationencet Thema hat 4 participant: |