DosProtectSetFilePtrL

From EDM2
Jump to: navigation, search

DosProtectSetFilePtrL moves the read or write pointer according to the type of move specified.

Syntax

DosProtectSetFilePtrL (hFile, ib, method, ibActual, fhFileHandleLockID)

Parameters

hFile (HFILE) input 
The handle returned by a previous DosOpenL function.
ib (LONGLONG) input 
The signed distance (offset) to move, in bytes.
method (LONG) input 
The method of moving.
This field specifies the location in the file at which the read/write pointer starts before adding the ib offset. The values and their meanings are as shown in the following list:
FILE_BEGIN Move the pointer from the beginning of the file.
FILE_CURRENT Move the pointer from the current location of the read/write pointer.
FILE_END Move the pointer from the end of the file.
Use this method to determine a file s size.
ibActual (PLONGLONG) output
Address of the new pointer location.
fhFileHandleLockID (FHLOCK) input
The filehandle lockid returned by a previous DosProtectOpenL.

Return Code

ulrc APIRET) returns
DosProtectSetFilePtrL returns one of the following values:
  • 0 NO_ERROR
  • ERROR_INVALID_FUNCTION
  • ERROR_INVALID_HANDLE
  • 132 ERROR_SEEK_ON_DEVICE
  • 131 ERROR_NEGATIVE_SEEK
  • 130 ERROR_DIRECT_ACCESS_HANDLE

Remarks

The read/write pointer in a file is a signed 64-bit number. A negative value for ib moves the pointer backward in the file; a positive value moves it forward. DosProtectSetFilePtrL cannot be used to move to a negative position in the file.

DosProtectSetFilePtrL cannot be used for a character device or pipe.

Example Code

This example opens or creates and opens a file named DOSPROT.DAT, writes a string to it, returns the file pointer to the beginning of the file, reads it, and finally closes it using DosProtect functions.

#define INCL_DOSFILEMGR        /* File Manager values */
#define INCL_DOSERRORS         /* DOS Error values    */
#include <os2.h>
#include <stdio.h>
#include <string.h>

int main(VOID){
  HFILE  hfFileHandle   = 0L;
  ULONG  ulAction       = 0;
  ULONG  ulBytesRead    = 0;
  ULONG  ulWrote        = 0;
  LONGLONG  ullLocal    = 0;
  UCHAR  uchFileName 20   = "dosprot.dat",
         uchFileData 100  = " ";
  FHLOCK FileHandleLock = 0;        /* File handle lock   */
  APIRET rc             = NO_ERROR; /* Return code */

/* Open the file test.dat.  Make it read/write, open it */
/* if it already exists and create it if it is new.     */
  rc = DosProtectOpenL(uchFileName,             /* File path name          */
                 hfFileHandle,                  /* File handle             */
                 ulAction,                      /* Action taken            */
       (LONGLONG)100,                           /* File primary allocation */
                FILE_ARCHIVED | FILE_NORMAL,    /* File attribute          */
                OPEN_ACTION_CREATE_IF_NEW |
                OPEN_ACTION_OPEN_IF_EXISTS,     /* Open function type      */
                OPEN_FLAGS_NOINHERIT |
                OPEN_SHARE_DENYNONE  |
                OPEN_ACCESS_READWRITE,          /* Open mode of the file   */
                0L,                             /* No extended attribute   */
                 FileHandleLock);               /* File handle lock id     */
  if (rc != NO_ERROR){
    printf("DosProtectOpenL error  return code = %u\n", rc);
    return 1;
  } else {
    printf ("DosProtectOpenL  Action taken = %u\n", ulAction);
  } /* endif */

/* Write a string to the file */
  strcpy (uchFileData, "testing...\n3...\n2...\n1\n");

  rc = DosProtectWrite (hfFileHandle,       /* File handle                  */
                 (PVOID) uchFileData,       /* String to be written         */
                 sizeof (uchFileData),      /* Size of string to be written */
                  ulWrote,                  /* Bytes actually written       */
                 FileHandleLock);           /* File handle lock id          */
  if (rc != NO_ERROR) {
    printf("DosProtectWrite error  return code = %u\n", rc);
    return 1;
  } else {
    printf ("DosProtectWrite  Bytes written = %u\n", ulWrote);
  } /* endif */

/* Move the file pointer back to the beginning of the file */
  rc = DosProtectSetFilePtrL (hfFileHandle,   /* File Handle          */
                      (LONGLONG)0,            /* Offset               */
                      FILE_BEGIN,             /* Move from BOF        */
                       ullLocal,              /* New location address */
                      FileHandleLock);        /* File handle lock id  */
  if (rc != NO_ERROR) {
    printf("DosSetFilePtr error  return code = %u\n", rc);
    return 1;
 

  /* Read the first 100 bytes of the file */
   rc = DosProtectRead (hfFileHandle,         /* File Handle                 */
                 uchFileData,                 /* String to be read           */
                 100L,                        /* Length of string to be read */
                  ulBytesRead,                /* Bytes actually read         */
                 FileHandleLock);             /* File handle lock id         */
  if (rc != NO_ERROR) {
    printf("DosProtectRead error  return code = %u\n", rc);
    return 1;
  } else {
    printf("DosProtectRead  Bytes read = %u\n%s\n", ulBytesRead, uchFileData);
  } /* endif */

  rc = DosProtectClose(hfFileHandle, FileHandleLock);   /* Close the file */
  if (rc != NO_ERROR) {
    printf("DosProtectClose error  return code = %u\n", rc);
    return 1;
  }
  return NO_ERROR;
}

Related Functions