我已经编写了一个程序,用于将一些文本文件导出到特定目录,我更喜欢使用MTIME,这是每个导出文件具有唯一名称的最佳方法,但是问题出在我们的服务器上,另一个进程正在使用MTIME导出相同的文件名使用不同的数据,因此将有机会发生巧合和覆盖。您能告诉我拥有唯一文件名的最佳方法吗?让我分享一些示例。
DEFINE INPUT PARAMETER ipData1 AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER ipData2 AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER ipData3 AS CHARACTER NO-UNDO.
DEFINE VARIABLE cExportData AS CHARACTER NO-UNDO FORMAT 'X(250)'.
DEFINE VARIABLE cPath AS CHARACTER NO-UNDO.
DEFINE VARIABLE cExt AS CHARACTER NO-UNDO.
DEFINE VARIABLE cSFTL AS CHARACTER NO-UNDO FORMAT 'X(150)'.
DEFINE VARIABLE cMessageDateTime AS CHARACTER NO-UNDO.
ASSIGN
cPath = "R:\Downloads\progress\"
cExt = ".Txt"
cMessageDateTime = "123456789".
OUTPUT TO VALUE (cPath + cMessageDateTime + STRING(MTIME) + cExt ).
put unformatted ipData1 skip ipData2 skip ipData3 skip "End."
OUTPUT CLOSE.
如果您看到的示例与我的逻辑有关。我在另一个过程中从FOR EACH循环传递了3个输入参数,因此我可以使用唯一的名称但使用MTIME来获取每个文件。所以你能告诉我另一种方法吗?
答案 0 :(得分:4)
您有几种选择:
1)使用Progress提供的程序:adecomm / _tmpfile.p
define variable fname as character no-undo format "x(30)".
run adecomm/_tmpfile.p ( "xxx", ".tmp", output fname ).
display fname.
2)使用GUID:
define variable fname as character no-undo format "x(30)".
fname = substitute( "&1&3&2", "xxx", ".tmp", GUID( GENERATE-UUID )).
display fname.
3)要求Windows执行此操作(如果您始终在Windows上运行):
define variable fname as character no-undo format "x(30)".
fname = System.IO.Path:GetTempFileName().
display fname.
4)反复试验:
define variable fname as character no-undo.
do while true:
fname = substitute( "&1&3&3", "xxx", ".tmp", string( random( 1, 1000 ), "9999" )).
file-info:filename = fname.
if file-info:full-pathname = ? then leave. /* if the file does NOT exist it is ok to use this name */
end.
display fname.
答案 1 :(得分:0)
您可能还需要传递令牌或某种标识符以使其真正唯一。可能是用户名,或者机器启动了。然后我的建议是将其与
连接REPLACE(STRING(今天),“ /”,“)+ STRING(MTIME)。
编辑:即使OP已将我的答案标记为正确,但事实并非如此。查看汤姆对此的回答,以获得更好的选择。
答案 2 :(得分:-1)
我以前曾经使用过。
(“文件名” + STRING(今天,“ 999999”)+“。csv”)。