Page 1 of 1

How to open a dbf with memo (.fpt) missing

Posted: Wed Nov 30, 2011 10:50 am
by gkuhnert
Hello all,

how do I open an dbf file if the according memofile (.ftp) is missing (without prompting an error)?

Thanks in advance for your help

Re: How to open a dbf with memo (.fpt) missing

Posted: Wed Nov 30, 2011 11:28 am
by Enrico Maria Giordano
I don't think you can open it. If you just want to trap the error then you can use a TRY/CATCH structure.

EMG

Re: How to open a dbf with memo (.fpt) missing

Posted: Wed Nov 30, 2011 11:34 am
by ukoenig
Change the 1. Byte ( Format-info ) from the DBF with a Hexeditor :
This sample shows => F5 = Foxpro with Memo
to open without Memo change the Byte to => 03 or try another Value from the Filetype-table

Download a free Hexeditor :
http://www.chmaas.handshake.de/

Image

Because of a missing Memo-file, it is impossible, to open the Dbf :

Image

Patching the 1. Byte, now it is possible, to open the DBF with the Editor.
( tested / changed F5 to Value 30 of Visual Foxpro )
Delete the Memo-field and save the DBF.

opened Dbf without the Fpt-file :

Image

Best Regards
Uwe :lol:

Re: How to open a dbf with memo (.fpt) missing

Posted: Fri Dec 02, 2011 7:36 am
by gkuhnert
@Uwe, Enrico: Thanks a lot.
I was hoping to be able to resolve this issue programmatically, like Visual dBase offers also to open the file without blob.
But in this case we'll have to handle the issue manually.

Re: How to open a dbf with memo (.fpt) missing

Posted: Fri Dec 02, 2011 3:49 pm
by StefanHaupt
Gilbert,

you can do it programmatically, just open the dbf with the low level functions fopen, fread, etc. Change the first bye and close the file.

Code: Select all

// The example implements a user-defined function that reads the
// entire contents of a file into a memory variable using
// low-level file functions:

   #include "FileIO.ch"

   PROCEDURE Main
      LOCAL cFile := "test.dbf" //"MyFile.txt"
      LOCAL cStream

      IF .NOT. ReadStream( cFile, @cStream )
         IF FError() <> 0
            ? "Error reading file:", FError()
         ELSE
            ? "File is empty"
         ENDIF
      ELSE
         ? "Successfully read", Len(cStream), "bytes"
      ENDIF
   RETURN

   FUNCTION ReadStream( cFile, cStream )
      LOCAL nFileHandle := FOpen( cFile )
      LOCAL nFileSize

      IF FError() <> 0
         RETURN .F.
      ENDIF

      nFileSize := FSeek( nFileHandle, 0, FS_END )
      cStream   := Space( nFileSize )
      FSeek( nFileHandle, 0, FS_SET )
      FRead( nFileHandle, @cStream, nFileSize )
      FClose( nFileHandle )
   RETURN ( FError() == 0 .AND. .NOT. Empty( cStream ) )