 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 02.01.2009, 14:31 Titel: Im Binary-Mode Datensätze verändern |
|
|
Hallo Leute,
ich hab ein Programm geschrieben, welches eine Datei kopieren soll. (Kopierroutine hab ich aus der QBMonFaq )
- Klappt soweit ganz gut.
Wenn die Datei aber schon existiert soll sie allerdings aktualisiert werden.
Also wollte ich den Datensatz aus der Quell-Datei und der Zieldatei auslesen, ihn vergleichen und wenn er anders ist, den Quell-Datensatz in die Ziel-Datei an dem jeweiligen Punkt einfügen.
Leider macht FreeBasic das nicht. Er erkennt zwar, dass die Datensätze verschieden sind, aber es erfolgt kein Schreib-Zugriff.
Existiert die Datei hingegen gar nicht, wird sie Problemlos kopiert.
Kann es sein, das man bestehende Datensätze in einer Datei nicht ändern kann?
Ich möchte nicht die gesammte Datei noch einmal komplett kopieren und die alte ersetzen!
Code: | DIM AS STRING Dat1, Dat2
DIM AS INTEGER teil
DIM AS LONGINT block
DIM AS STRING c1,c2
Dat1 = "original.txt"
Dat2 = "kopie.txt"
teil = 131072 '128KB Puffer
c1 = ""
c2 = ""
block = 0
OPEN Dat1 FOR BINARY ACCESS READ LOCK WRITE AS #1
OPEN Dat2 FOR BINARY ACCESS READ WRITE LOCK READ WRITE AS #2
DO UNTIL LOC(1) = LOF(1) OR INKEY = CHR(27)
IF LOF(1) - LOC(1) < teil THEN
c1 = SPACE$(LOF(1) - LOC(1))
ELSE
c1 = SPACE$(teil)
END IF
GET #1, block*teil, c1
IF LOF(2) - LOC(2) < teil THEN
c2 = SPACE$(LOF(2) - LOC(2))
ELSE
c2 = SPACE$(teil)
END IF
GET #2, block*teil, c2
IF NOT c1 = c2 THEN PUT #2, block*teil, c1 'Hier steht der Befehl für den Schreibzugriff
PRINT c1
PRINT c2
block +=1
SLEEP 1
LOOP
CLOSE #2
CLOSE #1
|
Achso und noch eine Frage:
Wie groß sollte der Lesepuffer sein? - Ich habe hier 128 KB genommen, was mir ziemlich groß erscheint. Außerdem verdoppelt sich ja, aufgrund der zwei Lese-Vorgänge der Speicherbedarf.
MfG Type |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 02.01.2009, 15:56 Titel: |
|
|
Hi,
ich vermute deine Dateien sind kleiner als 128kByte?
Dann wird hier Code: | IF NOT c1 = c2 THEN PUT #2, block*teil, c1 | nicht in die Ziel-Datei geschrieben, da sie die Datenmenge (128kB) nicht abnehmen kann .
Bei kleinerer Blockgröße geht es . _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 02.01.2009, 18:01 Titel: |
|
|
Hallo,
Alles klar, jetzt geht es.
Allerdings eröffnen sich mir gerade neue Probleme:
Dadurch das man ja alle Dateien kopieren können soll (also auch sehr kleine) habe ich zwischen den beiden Open-Befehlen noch eine Abfrage gesetzt, die den Puffer gegebenenfalls verkleinern soll.
Code: | OPEN Dat1 FOR BINARY ACCESS READ LOCK WRITE AS #1
IF LOF(1) < teil THEN teil = LOF(1)
OPEN Dat2 FOR BINARY ACCESS READ WRITE LOCK READ WRITE AS #2 |
Aber irgendwie hat es keinen Effekt. - Ich weis nicht, ob es für die Performance klug ist, ab 128KB alles byteweise zu kopieren. - also z.B. mit: Code: | IF LOF(1) < teil THEN teil = 1 |
- was aber Funktioniert
Das nächste Problem ist, dass es zu Fehlern kommt, wenn die Blöcke am Ende ungleich groß sind. (Wenn also die Quell-Datei größer oder kleiner ist, als die Zieldatei.)
Ist die Quelle größer als das Ziel, so wird mit der PUT-Anweisung nichts geschrieben.
Ist die Quell-Datei kleiner, so müsste man den Rest vom Ziel abschneiden. -> wie geht das!?
Danke schonmal für eure Mühe!
MfG Type |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|