Каков наилучший способ иметь уникальное имя файла для каждого файла? - PullRequest
0 голосов
/ 03 июня 2019

Я написал программу для экспорта некоторых текстовых файлов в определенный каталог, и я предпочел использовать 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.

Если вы видите пример, связанный с моей логикой.Я передаю 3 входных параметра из цикла FOR EACH в другой процедуре, чтобы я мог получить каждый файл с уникальным именем, но использовал MTIME.Так не могли бы вы сказать мне альтернативный способ ??

Ответы [ 2 ]

4 голосов
/ 04 июня 2019

У вас есть несколько вариантов:

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.
0 голосов
/ 04 июня 2019

Вам, вероятно, также понадобится передать токен или какой-нибудь идентификатор, чтобы сделать это действительно уникальным. Может быть, имя пользователя или машина включена, что-то в этом роде Тогда мой совет будет объединить это с

ЗАМЕНА (STRING (СЕГОДНЯ), '/', '') + STRING (MTIME).

Редактировать: хотя ОП пометил мой ответ как правильный, это не так. Проверьте ответ Тома на это для лучших вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...