PROGRESS - 验证用户输入文件输出路径

Posted

技术标签:

【中文标题】PROGRESS - 验证用户输入文件输出路径【英文标题】:PROGRESS - Validating a user-input file output path 【发布时间】:2013-11-18 04:45:12 【问题描述】:

我编写了一些 PROGRESS 代码,将一些数据输出到用户定义的文件。数据本身并不重要,输出过程可以正常工作。基本上是

定义变量文件路径。 UPDATE filePath /*用户类型类似于 C:\UserAccount\New.txt */ 输出到(值)文件路径。

效果很好,在输入目录中创建了一个 txt 文件。我的问题是:

progress 是否有任何功能可以让我检查输入是否 文件路径是否有效? (具体来说,如果用户输入了一个有效的目录,并且他们有权在他们选择的目录中创建文件)

任何意见或反馈将不胜感激。

【问题讨论】:

你的意思是输出到值(文件路径)。 ? 【参考方案1】:

文件信息

使用系统句柄 FILE-INFO 可以为您提供大量信息。它也适用于目录。

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.  

对具有写入权限的现有目录的简单检查可能类似于:

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 将以 D 开头表示目录,以 F 开头表示普通文件。它还包括有关读写权限的信息。查看帮助以获取更多信息。如果文件不存在,则除了 FILE-NAME 之外的所有属性基本上都将为空或未知 (?)。

编辑:似乎 FILE-TYPE 在某些情况下会返回 W,即使该目录中没有实际的写入权限,所以我可能需要通过错误处理来处理这个问题

错误处理

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 命令将起作用。如果文件存在,则返回完整路径。但是,它不适用于目录,仅适用于文件。如果您在没有完整路径的情况下进行搜索,例如 SEARCH("test.p"),该命令将搜索 PROPATH 环境变量中设置的目录并返回第一个具有完整路径的匹配条目。如果没有匹配,它将返回未知值 (?)。

语法:

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

【讨论】:

【参考方案2】:

SYSTEM-DIALOG GET-FILE 字符域有一个选项必须存在,如果你想使用对话从用户那里获取文件名/目录。手册中的示例

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.

【讨论】:

澄清一下:SYSTEM-DIALOG GET-FILE 用于打开操作系统级别的“打开文件”对话框,用户可以在其中选择文件。在您需要时很好,但并非总是如此(日志文件、批处理报告等)。

以上是关于PROGRESS - 验证用户输入文件输出路径的主要内容,如果未能解决你的问题,请参考以下文章

文件包含漏洞

输入输出-总

Android中的输入输出路径

第15章.输入/输出

文件路径作为命令行参数

个人作业——词频统计