Как мне получить последний файл из каталога в процессе выполнения 4gl?

#progress-4gl #openedge #datestamp

#прогресс-4gl #openedge #метка даты

Вопрос:

 DEFINE VARIABLE cDir  AS CHARACTER NO-UNDO initial '/home/raj/'.

define temp-table tt-file
       field tfile as char format "x(22)".
define variable vfile as char format "x(22)" no-undo.

INPUT FROM OS-DIR (cDir) ECHO.

REPEAT:

    create tt-file.
    IMPORT tt-file.tfile.
        FILE-INFO:FILE-NAME = cDir   tt-file.tfile.
      if file-info:file-name begins cdir   "RATES"
         and string(month(file-info:file-mod-date)) = string(month(today)) THEN    
     DISPLAY tt-file.tfile FORMAT "X(22)" LABEL 'name of the file'
             FILE-INFO:FULL-PATHNAME FORMAT "X(21)" LABEL 'FULL-PATHNAME'
             FILE-INFO:PATHNAME FORMAT "X(30)" LABEL 'PATHNAME'
             FILE-INFO:FILE-TYPE FORMAT "X(5)" LABEL 'FILE-TYPE'
             file-info:file-mod-date.
end.
  

Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть несколько файлов за текущий месяц, но мне нужно получить последний файл за месяц.

Ответ №1:

Почему бы не добавить два поля для создания файла: дата и время? Затем вы можете легко написать простое предложение WHERE, которое возвращает вам последний файл между двумя датами.

 DEFINE VARIABLE cDir  AS CHARACTER NO-UNDO INITIAL '/home/raj/'.

DEFINE TEMP-TABLE tt-file NO-UNDO
       FIELD tfile      AS CHARACTER FORMAT "x(22)"
       FIELD createDate AS DATE
       FIELD createTime AS INTEGER.

INPUT FROM OS-DIR (cDir).
REPEAT:
    CREATE tt-file.
    IMPORT tt-file.tfile.

    FILE-INFO:FILE-NAME = cDir   tt-file.tfile.

    ASSIGN 
        tt-file.createDate = FILE-INFO:FILE-CREATE-DATE
        tt-file.createtime = FILE-INFO:FILE-CREATE-TIME.
END.

/* Here you could add any logic to get your file */
FOR EACH tt-file NO-LOCK BY tt-file.createDate BY tt-file.createtime:
    DISP tt-file.
END.

/* Updated example for doing things only with .csv files */
FOR EACH tt-file NO-LOCK WHERE tt-file.tfile MATCHES "*csv" 
                            BY tt-file.createDate 
                            BY tt-file.createtime:
    DISP tt-file.
END.
  

В зависимости от вашего приложения вы можете захотеть использовать FILE-MOD-DATE amp; FILE-MOD-TIME вместо этого.

Комментарии:

1. Спасибо jenscd.я получил последний файл с помощью break by. Для каждого tt-файла, где tfile начинается с «RATES» и tt-file.tfiletype = «FRW», блокировка НЕ прерывается с ПОМОЩЬЮ tt-file.CreateDate С ПОМОЩЬЮ tt-file.createtime: если последний (createdate), затем удалите tt-файл с 2-мя столбцами. END

2. Я могу получить последний файл, который начинается с «TAXRATES», но я ТАКЖЕ ХОЧУ ИМЕТЬ ТОЛЬКО ФАЙЛЫ «.CSV». Как мне ЭТО СДЕЛАТЬ?

3. Спасибо jensd. Я использовал индекс word во временной таблице и использовал contains word для переноса CSV-файлов.

Ответ №2:

Ваш пример показывает, что вы используете unix / linux. Вы могли бы использовать os-command

 define variable cDir as character no-undo form "x(65)" initial '/home/raj/'.
define variable cFileName as character no-undo form "x(65)".
input through value(substitute("ls -1t amp;1", cDir)).

repeat:
    import unformatted cFileName.
    display cFileName.
    /* if .... then */ leave.
end.
  

Вместо ls вы также могли бы обработать результаты find команды. Для этого потребуется немного больше кода, но он намного мощнее.