我编写了一些PROGRESS代码,将一些数据输出到用户定义的文件中。数据本身并不重要,输出过程工作正常。基本上是
定义变量文件路径。UPDATE filePath/*User 键入类似 C:\UserAccount\New.txt */输出到(值)文件路径。
工作正常,在输入目录中创建一个 txt 文件。我的问题是:
进度是否有任何功能可以让我检查输入文件路径是否有效?(具体来说,如果用户输入了有效的目录,并且他们有权在他们选择的目录中创建文件)
任何意见或反馈将不胜感激。
文件信息
使用系统句柄 FILE-INFO 会为您提供大量信息。它也适用于目录。
FILE-INFO:FILE-NAME = "c:temptest.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.
文件名:文件类型将以 D 开头表示目录,F 以 F 表示纯文件开头。它还包括有关读取和写入权限的信息。有关详细信息,请查看帮助。如果文件不存在,则除 FILE-NAME 之外的所有属性基本上都将为空或未知 (?)。
编辑:似乎 FILE-TYPE 在某些情况下返回 W 即使该目录中没有实际的写入权限,所以我您可能需要通过错误处理来处理这个问题
错误处理
OUTPUT TO VALUE("f:personaltest.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:temptest.p") = ? THEN
MESSAGE "No such file" VIEW-AS ALERT-BOX ERROR.
ELSE
MESSAGE "OK" VIEW-AS ALERT-BOX INFORMATION.
系统对话框获取文件字符字段有一个选项必须存在,如果你想使用代言从用户那里获取文件名/目录。手册中的示例
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.