Re: find the size of a file

From: Paul Sturgis <psturgis_at_tgn.nospam.net>
Date: Thu, 28 Oct 1999 02:28:43 GMT
Message-ID: <3817b1b9.3464701_at_news.c-com.net>


On Sun, 24 Oct 1999 13:14:31 +0800, Connor McDonald <connor_mcdonald_at_yahoo.com> wrote:

>Danny Lee wrote:
>>
>> Hi, experienced oracle developers:
>>
>> Just wonder how can I find out the size of a file within Forms 5.0
>> applications.
>> The full path is known and I know how to open the file, but the TEXI_IO
>> package does not have a function to find out the file size!
>>
>> Thanks in advance.
>>
>> Danny
>
>(Awful solution coming up...)
>
>On PC: host out a 'dir' on the file and pipe the output to a file name
>and then use TEXT_IO (or grep for Windows ) to read the bytes...
>
>On Unix: same thing but using 'ls -l'
>
>Ugh!

A Better Solution (assuming Windows platform)would be to use the ORA_FFI package to make API Calls. Here's a quick & dirty package that'll work:
(you'll want to add some exception handling)

------------------------------------Spec--------------------------------
PACKAGE WinFile IS

FUNCTION Get_Size(p_file_name IN VARCHAR2)   RETURN PLS_INTEGER; END WinFile;

----------------BODY-------------------------------------------

PACKAGE BODY WinFile IS 
     lh_kernel32    ora_ffi.libHandleType;

     fh_CreateFileA ora_ffi.funcHandleType;
     fh_GetFileSize ora_ffi.funcHandleType;
     fh_CloseHandle ora_ffi.funcHandleType;

  
      /*  File Constants */
     GENERIC_READ      CONSTANT PLS_INTEGER := -2147483647;
     FILE_SHARE_READ   CONSTANT PLS_INTEGER := 1;
     OPEN_EXISTING     CONSTANT PLS_INTEGER := 3;


/*===================================================================
  =  CreateFile - Private API Procedure
  =             - Returns opened File Handle if successful
  =

*/
FUNCTION i_CreateFileA(funcHandle IN ora_ffi.funcHandleType,
                       lpFileName            IN OUT VARCHAR2,
                       dwDesiredAccess       IN     PLS_INTEGER,
                       dwShareMode           IN     PLS_INTEGER,
                       lpSecurityAttributes  IN OUT PLS_INTEGER,
                       dwCreationDisposition IN     PLS_INTEGER,
                       dwFlagsAndAttributes  IN     PLS_INTEGER,
                       hTemplateFile         IN     PLS_INTEGER)
     RETURN PLS_INTEGER;

PRAGMA INTERFACE(C,i_CreateFileA,11265);
FUNCTION CreateFile(lpFileName            IN   VARCHAR2,
                     dwDesiredAccess       IN   PLS_INTEGER :=
GENERIC_READ,
                     dwShareMode           IN   PLS_INTEGER :=
FILE_SHARE_READ,
                     lpSecurityAttributes  IN   PLS_INTEGER := NULL,
                     dwCreationDisposition IN   PLS_INTEGER :=
OPEN_EXISTING,
                     dwFlagsAndAttributes  IN   PLS_INTEGER := 0,
                     hTemplateFile         IN   PLS_INTEGER := 0)
RETURN PLS_INTEGER IS 
  lpFileName_l            VARCHAR2(512) := lpFileName;
  dwDesiredAccess_l       PLS_INTEGER := dwDesiredAccess;
  dwShareMode_l           PLS_INTEGER := dwShareMode;
  lpSecurityAttributes_l  PLS_INTEGER := lpSecurityAttributes;
  dwCreationDisposition_l PLS_INTEGER := dwCreationDisposition;
  dwFlagsAndAttributes_l  PLS_INTEGER := dwFlagsAndAttributes;
  hTemplateFile_l         PLS_INTEGER := hTemplateFile;
  rc                      PLS_INTEGER;
BEGIN 
     rc  := i_CreateFileA(fh_CreateFileA,
                          lpFileName_l,
                          dwDesiredAccess_l,
                          dwShareMode_l, 
                          lpSecurityAttributes_l,
                          dwCreationDisposition_l,
                          dwFlagsAndAttributes_l,
                          hTemplateFile_l);

    RETURN (rc);
END ;

/*===================================================================
  =  GetFileSize - Private API Function

  =

*/
FUNCTION i_GetFileSize(funcHandle     IN     ora_ffi.funcHandleType,
                       hFile          IN     PLS_INTEGER,
                       lpFileSizeHigh IN OUT PLS_INTEGER)
  RETURN PLS_INTEGER;
PRAGMA INTERFACE(C,i_GetFileSize,11265);
FUNCTION GetFileSize(hFile          IN   PLS_INTEGER,
                     lpFileSizeHigh IN   PLS_INTEGER)
  RETURN PLS_INTEGER IS 
 hFile_l          PLS_INTEGER := hFile;
 lpFileSizeHigh_l PLS_INTEGER := lpFileSizeHigh;
 rc               PLS_INTEGER;
BEGIN 
     rc  := i_GetFileSize(fh_GetFileSize,
                          hFile_l,
                          lpFileSizeHigh_l);

  RETURN (rc);
END ;

/*===================================================================
  =  CloseHandle - Private API Call Procedure to Close File Handle
  =              - Return Value discarded
  =

*/
FUNCTION i_CloseHandle(funcHandle IN ora_ffi.funcHandleType,
                     hFile          IN  PLS_INTEGER)
   RETURN PLS_INTEGER;
PRAGMA INTERFACE(C,i_CloseHandle,11265);

PROCEDURE CloseHandle(hFile IN PLS_INTEGER) IS
 hFile_l PLS_INTEGER := hFile;
 rc PLS_INTEGER;
BEGIN
   rc := i_CloseHandle(fh_CloseHandle,

                       hFile_l);

END;
/*===================================================================
  =  Get_File_Size - Public Function
  =                      IN - Fully Qualified Filename
  • RETURNS - File Size in bytes (up to 2 GB) if successful, else -1
    */ FUNCTION Get_Size(p_file_name IN VARCHAR2) RETURN PLS_INTEGER IS

 INVALID_HANDLE_VALUE CONSTANT integer:= -1;

 v_file_handle integer := 0;
 v_result integer := -1;

BEGIN
  v_file_handle := CreateFile(p_file_name);

  IF v_file_handle <> INVALID_HANDLE_VALUE THEN     v_result := GetFileSize(v_file_handle, NULL);

    CloseHandle(v_file_handle);
  END IF;   RETURN v_result;

END; BEGIN

     BEGIN 
        lh_kernel32 := ora_ffi.find_library('kernel32.dll');
     EXCEPTION WHEN ora_ffi.FFI_ERROR THEN 
        lh_kernel32 := ora_ffi.load_library(NULL,'kernel32.dll');
     END ;

     fh_CreateFileA :=
ora_ffi.register_function(lh_kernel32,'CreateFileA',ora_ffi.PASCAL_STD);
     ora_ffi.register_parameter(fh_CreateFileA,ORA_FFI.C_CHAR_PTR);
     ora_ffi.register_parameter(fh_CreateFileA,ORA_FFI.C_INT);
     ora_ffi.register_parameter(fh_CreateFileA,ORA_FFI.C_INT);
     ora_ffi.register_parameter(fh_CreateFileA,ORA_FFI.C_INT_PTR);
     ora_ffi.register_parameter(fh_CreateFileA,ORA_FFI.C_INT);
     ora_ffi.register_parameter(fh_CreateFileA,ORA_FFI.C_INT);
     ora_ffi.register_parameter(fh_CreateFileA,ORA_FFI.C_INT);
     ora_ffi.register_return(fh_CreateFileA,ORA_FFI.C_INT);

     fh_GetFileSize :=
ora_ffi.register_function(lh_kernel32,'GetFileSize',ora_ffi.PASCAL_STD);
     ora_ffi.register_parameter(fh_GetFileSize,ORA_FFI.C_INT);
     ora_ffi.register_parameter(fh_GetFileSize,ORA_FFI.C_INT_PTR);
     ora_ffi.register_return(fh_GetFileSize,ORA_FFI.C_INT);

     fh_CloseHandle :=
ora_ffi.register_function(lh_kernel32,'CloseHandle',ora_ffi.PASCAL_STD);
     ora_ffi.register_parameter(fh_CloseHandle,ORA_FFI.C_INT);
     ora_ffi.register_return(fh_CloseHandle,ORA_FFI.C_INT);

END WinFile;

      Paul Sturgis Received on Thu Oct 28 1999 - 04:28:43 CEST

Original text of this message