Re: find the size of a file
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