为每个文件拥有唯一文件名的最佳方法是什么?

时间:2019-06-03 16:47:36

标签: openedge progress-4gl

我已经编写了一个程序,用于将一些文本文件导出到特定目录,我更喜欢使用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来获取每个文件。所以你能告诉我另一种方法吗?

3 个答案:

答案 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”)。