Hi HeXOR
Ich habe mich entschlossen deinen 2ten Code zu benutzen da er deutlich schneller ist als der 1te.
Leider kamen noch zwei kleinere Fehler hoch, die ich unten korrigieren mußte.
1. EndProcedure fehlte.
2. Wenn der gesuchte Text nicht gefunden wurde, weil schon gepatched, lief die suche über das Ende der Datei hinaus.
leider habe ich nun ein neues kleines Problem.
Die Zeichenkette kommt 2 Mal in der Datei vor.
Ich weiß zwar, dass ich die erste ändern muß und könnte dies auch ausnützen und mit dem Break heraus springen.
Im nächsten Anlauf würde aber dann die Routine die zweite Zeichenkette patchen.
Wenn ich meine Zeichenkette erweitern könnte, wäre das möglich, das Problem ist aber, dass als Trenner ein NUL kommt.
Ursprünglich hatte ich auch einen etwas längeren Suchstring gebastelt.
In etwa so
Code: Alles auswählen
If PeekS( *Dateiinhalt + I, 20) = "gesuchter Text" + Chr(NUL) + "Mehr text"
aber beim Procedureaufruf geht das ja nicht mehr.
Wie kann man das anpassen?
Schon mal ein Danke an alle die sich bislang beteiligt haben.
BYe André
Code: Alles auswählen
Procedure PatchFile(File.s, *MemToFind, *MemToSet, MemLength, BlockSize = 1024)
Protected FID, i, Size, Pos.q, *Buffer, Result
If FileSize(File) > 0
FID = OpenFile(#PB_Any, File)
If FID
*Buffer = AllocateMemory(BlockSize)
If *Buffer
Pos = 0
Repeat
Size = ReadData(FID, *Buffer, BlockSize)
For i = 0 To Size - MemLength - 1
If CompareMemory(*Buffer + i, *MemToFind, MemLength)
FileSeek(FID, Pos + i)
WriteData(FID, *MemToSet, MemLength)
Result = #True
Break 2
EndIf
Next i
Pos + Size - MemLength ;Pos + BlockSize - MemLength
FileSeek(FID, Pos)
Until Size < BlockSize
FreeMemory(*Buffer)
EndIf
CloseFile(FID)
EndIf
EndIf
ProcedureReturn Result
EndProcedure ;EndIf
If PatchFile("\\192.168.1.7\import\A", @"Alter Text", @"Neuer Text", StringByteLength("Alter Text"))
Debug "O.k., Successfully patched!"
EndIf