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

Thi*_*iru -1 progress-4gl openedge

我已经编写了一个程序,用于将某些文本文件导出到特定目录,我更喜欢使用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.
Run Code Online (Sandbox Code Playgroud)

如果您看到示例,它与我的逻辑有关。我在另一个过程中从FOR EACH循环传递了3个输入参数,所以我可以使用唯一的名称但使用MTIME来获取每个文件。那么,您能告诉我另一种方法吗?

Tom*_*com 5

您有几种选择:

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.
Run Code Online (Sandbox Code Playgroud)

2)使用GUID:

define variable fname as character no-undo format "x(30)".
fname = substitute( "&1&3&2", "xxx", ".tmp", GUID( GENERATE-UUID )).
display fname.
Run Code Online (Sandbox Code Playgroud)

3)要求Windows执行此操作(如果您始终在Windows上运行):

define variable fname as character no-undo format "x(30)".
fname = System.IO.Path:GetTempFileName().
display fname.
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

  • 3 B)请Linux来做。那将是签出可以创建临时文件和目录的`mktemp`。 (2认同)