SET PROCEDURE TO MEMOREPAIR.PRG ? RepairMemoHeader( "SO.FPT" )A value of True (.T.) was returned.
>Function RepairMemoHeader >Lparameters tcMemoFilename >Local handle, lnFileSize, lnNextBlockPointer, lnBlockSize, lnFirstBlock, lnCalculatedFileSize > >handle=fopen(tcMemoFilename,12) && Opened readwrite >lnFileSize = fseek(handle,0,2) && Get file size >* Read header info >lnNextBlockPointer = ReadBytes(handle, 0,4,.T.) && Stored in left-to-right format >lnBlockSize = ReadBytes(handle, 6,2,.T.) && Stored in left-to-right format > >* Specific to me - no blocksize setting to something other than default 0x40 >If lnBlockSize # 0x40 > WriteBytes(handle, 6,2,0x40,.T.) > lnBlockSize=0x40 >Endif >* > >lnFirstBlock = ceiling(512/lnBlockSize) && Possible min lnNextblockpointer >lnCalculatedFileSize = lnNextBlockPointer*lnBlockSize > >* Fix if needs repair >If !(lnFileSize >= 512 ; > and lnNextBlockPointer >= lnFirstBlock ; > and lnCalculatedFileSize >= lnFileSize) && Memo needs repair > lnNextBlockPointer = max(lnNextBlockPointer, lnFirstBlock) > lnFileSize = lnNextBlockPointer * lnBlockSize > WriteBytes(handle, 0,4,lnNextBlockPointer,.T.) && Fix next block pointer > =fchsize(handle, lnFileSize) && Fix filesize >Endif >=fclose(handle) > >Function ReadBytes >Lparameters tnHandle, tnPos, tnSize, tlLR >Local lcString, lnRetValue,ix >=fseek(tnHandle, tnPos,0) && Go to pos >lcString = fread(tnHandle, tnSize) && Read tnSize bytes >lnRetValue = 0 >For ix=0 to tnSize-1 && Convert to a number > lnRetValue = lnRetValue + asc(substr(lcString,ix+1)) * ; > iif(tlLR,256^(tnSize-1-ix),256^ix) >Endfor >Return int(lnRetValue) > >Function WriteBytes >Lparameters tnHandle, tnPos, tnSize, tnNumber, tlLR >Local lcString, lnLowDword, lnHighDword,ix >lcString='' >If tlLR > For ix=tnSize-1 to 0 step -1 > lcString=lcString+chr(tnNumber/256^ix%256) > Endfor >Else > For ix=0 to tnSize-1 > lcString=lcString+chr(tnNumber/256^ix%256) > Endfor >Endif >=fseek(tnHandle, tnPos,0) && Go to pos >Return fwrite(tnHandle,lcString) >Cetin