【问题标题】:What is the best way to have a unique file name for each files?为每个文件设置唯一文件名的最佳方法是什么?
【发布时间】:2019-06-03 16:47:36
【问题描述】:

我编写了一个程序,用于将一些文本文件导出到特定目录。所以我更喜欢使用 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.

【问题讨论】:

    标签: openedge progress-4gl


    【解决方案1】:

    您有多种选择:

    1. 使用 Progress 提供的程序:adecomm/_tmpfile.p

      将变量 fname 定义为字符不可撤销格式“x(30)”。 运行 adecomm/_tmpfile.p ( "xxx", ".tmp", 输出 fname )。 显示 fname。

    2. 使用 GUID:

      将变量 fname 定义为字符不可撤销格式“x(30)”。 fname = 替代(“&1&3&2”,“xxx”,“.tmp”,GUID(生成-UUID))。 显示 fname。

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

      将变量 fname 定义为字符不可撤销格式“x(30)”。 fname = System.IO.Path:GetTempFileName()。 显示 fname。

    4. 试错:

      将变量 fname 定义为不可撤销字符。

      当真时做:

      fname = 替换(“&1&3&2”、“xxx”、“.tmp”、字符串(随机(1、1000)、“9999”))。 文件信息:文件名 = fname。 如果文件信息:完整路径名 = ?然后离开了。 /* 如果文件不存在,可以使用这个名字 */

      结束。

      显示 fname。

    【讨论】:

    • 3 B) 让 Linux 去做。那就是检查可以创建临时文件和目录的mktemp
    • @Tom - 很抱歉问这个问题,因为我是这种语言的新手。 “&1&3&3”、“xxx”、“.tmp”是什么意思?
    • SUBSTITUTE() 用掩码字符串后面的参数替换 &1 等。
    【解决方案2】:

    您可能还需要传递一个令牌或某种标识符,以使其真正独一无二。也许是用户名,或者机器已经启动,类似的东西。那么我的建议是将其与

    连接起来

    替换 (STRING(TODAY),'/','') + STRING(MTIME)。

    编辑:尽管 OP 已将我的答案标记为正确,但事实并非如此。查看 Tom 对此的回答以获得更好的选择。

    【讨论】:

    • 没有。这种情况下也有
    • 不,这是错误的。它并不总是独一无二的。任何运行多个进程的系统都可以通过这种方式创建两个或多个同名文件。
    • 我很抱歉,汤姆是正确的。我错过了您已经有冲突名称的部分,我认为这只会由服务器产生。我的错。您可能希望传递某种使其独一无二的令牌以及答案中的内容。
    【解决方案3】:

    我以前用过这个。

    ("文件名" + STRING(TODAY,"999999") + ".csv")。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 2023-03-25
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多