Kbase P102627: How to suppress error 98 when using OUTPUT TO statement?
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  30/03/2005 |
|
Status: Unverified
GOAL:
How to suppress error 98 when using OUTPUT TO statement?
GOAL:
How to check that a filename is valid and its directory exists before using OUTPUT TO statement?
GOAL:
How to validate a filename?
FACT(s) (Environment):
Windows
FIX:
Progress does not have a native mechanism to suppress error 98 when outputting to a file where the filename is invalid, the directory does not exist or the application user does not have valid permissions. Solutions include file name validation, directory existence checking and permissions and security validation.
The following code uses the Windows CreateFileA and CloseHandle API functions to ensure that the file name is valid and that the specified directory exists before using the the Progress 4GL OUTPUT TO FileName statement:
DEFINE VARIABLE clpFileName AS CHARACTER NO-UNDO.
DEFINE VARIABLE iCreateFileAReturn AS INTEGER NO-UNDO.
DEFINE VARIABLE iCloseHandleReturn AS INTEGER NO-UNDO.
ASSIGN
clpFileName = 'C:\OpenEdge\WRK100B\myfi3le.txt'.
RUN CreateFileA (
INPUT clpFileName,
INPUT 2031616, /* STANDARD_RIGHTS_ALL */
INPUT 7, /* FILE_SHARE_DELETE & FILE_SHARE_READ & FILE_SHARE_WRITE */
INPUT 0, /* No Security attributes, use Default Security Descriptor */
INPUT 2, /* CREATE_ALWAYS */
INPUT 128, /* FILE_ATTRIBUTE_NORMAL */
INPUT 0, /* No Existing File Template Used */
OUTPUT iCreateFileAReturn ).
IF iCreateFileAReturn <> -1 THEN DO:
RUN CloseHandle (INPUT iCreateFileAReturn, OUTPUT iCloseHandleReturn).
OUTPUT TO VALUE(clpFileName).
DISPLAY "this is a test" FORMAT "x(80)".
OUTPUT CLOSE.
END.
ELSE
DO:
DEFINE VARIABLE iGetLastErrorResult AS INTEGER NO-UNDO.
RUN GetLastError(OUTPUT iGetLastErrorResult).
CASE iGetLastErrorResult:
WHEN 3 THEN
MESSAGE "The system cannot find the path specified."
VIEW-AS ALERT-BOX INFO BUTTONS OK.
WHEN 123 THEN
MESSAGE "The filename, directory name, or volume label syntax is incorrect."
VIEW-AS ALERT-BOX INFO BUTTONS OK.
OTHERWISE
MESSAGE "System Error Code = " iGetLastErrorResult "~n"
"For a complete listing of MS Windows System Error Codes, visit: " "~n"
"http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END CASE.
END.
PROCEDURE Cr.eateFileA EXTERNAL "kernel32.dll":
DEFINE INPUT PARAMETER lpFileName AS CHAR.
DEFINE INPUT PARAMETER dwDesiredAccess AS LONG.
DEFINE INPUT PARAMETER dwShareMode AS LONG.
DEFINE INPUT PARAMETER lpSecurityAttributes AS LONG.
DEFINE INPUT PARAMETER dwCreationDisposition AS LONG.
DEFINE INPUT PARAMETER dwFlagsAndAttributes AS LONG.
DEFINE INPUT PARAMETER hTemplateFile AS LONG.
DEFINE RETURN PARAMETER ReturnValues AS LONG.
END.
PROCEDURE CloseHandle EXTERNAL "kernel32.dll":
DEFINE INPUT PARAMETER hObject AS LONG.
DEFINE RETURN PARAMETER RetResult AS LONG.
END.
PROCEDURE GetLastError EXTERNAL "KERNEL32.DLL":
DEFINE RETURN PARAMETER nResult AS LONG.
END..