为每个文件设置唯一文件名的最佳方法是什么?
What is the best way to have a unique file name for each files?
我编写了一个程序,用于将一些文本文件导出到特定目录。所以我更喜欢使用 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.
您可能还需要传递一个令牌或某种标识符,以使其真正独一无二。也许是用户名,或者机器启动了,诸如此类。那么我的建议是将其与
连接起来
REPLACE (STRING(TODAY),'/','') + STRING(MTIME).
编辑:尽管 OP 将我的回答标记为正确,但事实并非如此。查看 Tom 对此的回答以获得更好的选择。
您有多种选择:
使用Progress提供的程序:adecomm/_tmpfile.p
将变量 fname 定义为字符 no-undo 格式“x(30)”。
运行 adecomm/_tmpfile.p(“xxx”,“.tmp”,输出 fname)。
显示 fname.
使用 GUID:
将变量 fname 定义为字符 no-undo 格式“x(30)”。
fname = substitute("&1&3&2", "xxx", ".tmp", GUID( GENERATE-UUID ))。
显示 fname.
让Windows去做(如果你总是运行宁Windows):
将变量 fname 定义为字符 no-undo 格式“x(30)”。
fname = System.IO.Path:GetTempFileName()。
显示 fname.
反复试验:
将变量 fname 定义为字符 no-undo.
当真时做:
fname = substitute( "&1&3&2", "xxx", ".tmp", string( random( 1, 1000 ), "9999" ))。
file-info:文件名 = fname.
如果 file-info:full-pathname = ?然后离开了。 /* 如果文件不存在,可以使用这个名字 */
结束。
显示名字。
我以前用过这个。
("Filename" + 字符串(今天,"999999") + ".csv").
我编写了一个程序,用于将一些文本文件导出到特定目录。所以我更喜欢使用 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.
您可能还需要传递一个令牌或某种标识符,以使其真正独一无二。也许是用户名,或者机器启动了,诸如此类。那么我的建议是将其与
连接起来REPLACE (STRING(TODAY),'/','') + STRING(MTIME).
编辑:尽管 OP 将我的回答标记为正确,但事实并非如此。查看 Tom 对此的回答以获得更好的选择。
您有多种选择:
使用Progress提供的程序:adecomm/_tmpfile.p
将变量 fname 定义为字符 no-undo 格式“x(30)”。 运行 adecomm/_tmpfile.p(“xxx”,“.tmp”,输出 fname)。 显示 fname.
使用 GUID:
将变量 fname 定义为字符 no-undo 格式“x(30)”。 fname = substitute("&1&3&2", "xxx", ".tmp", GUID( GENERATE-UUID ))。 显示 fname.
让Windows去做(如果你总是运行宁Windows):
将变量 fname 定义为字符 no-undo 格式“x(30)”。 fname = System.IO.Path:GetTempFileName()。 显示 fname.
反复试验:
将变量 fname 定义为字符 no-undo.
当真时做:
fname = substitute( "&1&3&2", "xxx", ".tmp", string( random( 1, 1000 ), "9999" ))。 file-info:文件名 = fname. 如果 file-info:full-pathname = ?然后离开了。 /* 如果文件不存在,可以使用这个名字 */
结束。
显示名字。
我以前用过这个。
("Filename" + 字符串(今天,"999999") + ".csv").