user2961924
user2961924

Reputation: 31

PROGRESS - Validating a user-input file output path

I've written some PROGRESS code that outputs some data to a user defined file. The data itself isn't important, the output process works fine. It's basically

DEFINE VARIABLE filePath. UPDATE filePath /*User types in something like C:\UserAccount\New.txt */ OUTPUT TO (VALUE) filePath.

Which works fine, a txt file is created in the input directory. My question is:

Does progress have any functionality that would allow me to check if an input file path is valid? (Specifically, if the user has input a valid directory, and if they have permission to create a file in the directory they've chosen)

Any input or feedback would be appreciated.

Upvotes: 3

Views: 4469

Answers (2)

AquaAlex
AquaAlex

Reputation: 380

SYSTEM-DIALOG GET-FILE character-field has an option MUST-EXIST if you want to use a dailogue to get filename/dir from user. Example from manual

DEFINE VARIABLE procname AS CHARACTER NO-UNDO.
DEFINE VARIABLE OKpressed AS LOGICAL INITIAL TRUE.
    Main: 
    REPEAT:    
        SYSTEM-DIALOG GET-FILE procname        
            TITLE      "Choose Procedure to Run ..."        
            FILTERS    "Source Files (*.p)"   "*.p",                   
                       "R-code Files (*.r)"   "*.r"        
            MUST-EXIST        
            USE-FILENAME        
            UPDATE OKpressed.          
        IF OKpressed = TRUE THEN        
            RUN VALUE(procname).    
        ELSE              
            LEAVE Main.            
END.

Upvotes: 2

Jensd
Jensd

Reputation: 8011

FILE-INFO

Using the system handle FILE-INFO gives you a lot of information. It also works on directories.

FILE-INFO:FILE-NAME = "c:\temp\test.p".

DISPLAY 
    FILE-INFO:FILE-NAME 
    FILE-INFO:FILE-CREATE-DATE 
    FILE-INFO:FILE-MOD-DATE 
    FILE-INFO:FILE-INFO 
    FILE-INFO:FILE-MOD-TIME 
    FILE-INFO:FILE-SIZE 
    FILE-NAME:FILE-TYPE  
    FILE-INFO:FULL-PATHNAME  
        WITH FRAME f1 1 COLUMN SIDE-LABELS.  

A simple check for existing directory with write rights could be something like:

FUNCTION dirOK RETURNS LOGICAL (INPUT pcDir AS CHARACTER):

    FILE-INFO:FILE-NAME = pcDir.

    IF  INDEX(FILE-INFO:FILE-TYPE, "D") > 0 
    AND INDEX(FILE-INFO:FILE-TYPE, "W") > 0 THEN 
        RETURN TRUE.
    ELSE 
        RETURN FALSE.
END FUNCTION.

FILE-NAME:FILE-TYPE will start with a D for directories and a F for plain files. It also includes information about reading and writing rights. Check the help for more info. If the file doesn't exist basically all attributes except FILE-NAME will be empty or unknown (?).

Edit: it seems that FILE-TYPE returns W in some cases even if there's no actual writing rights in that directory so I you might need to handle this through error processing instead

ERROR PROCESSING

OUTPUT TO VALUE("f:\personal\test.txt").
PUT UNFORMATTED "Test" SKIP.
OUTPUT CLOSE.


CATCH eAnyError AS Progress.Lang.ERROR:  
/* Here you could check for specifically error no 98 indicating a problem opening the file */
MESSAGE 
    "Error message and number retrieved from error object..."    
    eAnyError:GetMessage(1) 
    eAnyError:GetMessageNum(1)     VIEW-AS ALERT-BOX BUTTONS OK.

END CATCH.

FINALLY:

END FINALLY.

SEARCH

When checking for a single file the SEARCH command will work. If the file exists it returns the complete path. It does however not work on directory, only files. If you SEARCH without complete path e g SEARCH("test.p") the command will search through the directories set in the PROPATH environment variable and return the first matching entry with complete path. If there's no match it will return unknown value (?).

Syntax:

IF SEARCH("c:\temp\test.p") = ? THEN 
    MESSAGE "No such file" VIEW-AS ALERT-BOX ERROR.
ELSE 
    MESSAGE "OK" VIEW-AS ALERT-BOX INFORMATION.

Upvotes: 4

Related Questions