Файловый интерфейс — операции с файлами

file-transfers-_114260033.s300x300Файловый интерфейс и юникод

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

  1. Должна быть возможность обмена данными между юникодными и не юникодными системами (т.к. отображение данных в памяти отличается);
  2. Должна быть возможность обмена данными между различными юникодными системами;
  3. Должна быть возможность обмена данными между разными не юникодными системами, в которых используются различные кодировки.

Данные требования накладывают определенные ограничения, так в юникодных системах требуется обязательное указание кодовой страницы, перед работой через интерфейс, кроме того:

  • Файл должен быть явным образом открыт (OPEN DATASET), перед операцией чтения или записи. Кроме того файл, который был уже открыт ранее, не может быть открыт снова (до тех пор, пока не будет закрыт). В не юникодных системах открытие файла происходит неявным образом при обращении к нему (например, при чтении), соответственно не требуется явного открытия перед началом работы. Кроме того, выражение для открытия файла может быть запущено неоднократно, несмотря на то, что открыть файл в программе можно только после его закрытия, либо в первый раз. Повторное открытие в не юникодных программах просто пропускается.
  • Тип доступа (INPUT,OUTPUT..) и режим обработки файла (TEXT, BINARY) должны быть явно определены, когда файл открывается. В не юникодных программах, если ничего не будет задано, файл откроется с неявно заданными параметрами по умолчанию.
  • Если файл открыт для чтения, возможно только чтение. В не юникодных системах кроме чтения, возможна так же и запись.
  • Если файл открыт как текстовый (дополнение TEXT), только символьные переменные могут быть считаны или записаны в него. В не юникодных системах допускается считывание и запись из байтовых или числовых переменных.

Рекомендуется придерживаться правил определенных в юникодных системах, даже если вы работаете в не юникодной системе.

Для поддержки работы с юникодом, был создан специальный системный класс CL_ABAP_FILE_UTILITIES. Некоторые его методы:

  • CHECK_FOR_BOM – проверить наличие в файле метки BOM.
  • CHECK_UTF8 – хранится ли файл в UTF-8. MAX_KB – определяет размер KB при сканировании.
  • CREATE_UTF8_FILE_WITH_BOM – создание файла в UTF-8 с меткой.
  • CHECK_XSTRING_UTF8 – проверить последовательность на наличие UTF-8 кодировки.
  • CHECK_STRING_7BIT_ASCII – проверяет, содержит ли строка только ASCII символы.

 

Операторы файлового интерфейса

Как было уже упомянуто ранее, файловый интерфейс в ABAP реализован с помощью набора операторов и их параметров:

  • OPEN DATASET
  • TRANSFER
  • READ DATASET
  • GET DATASET
  • SET DATASET
  • TRUNCATE DATASET
  • CLOSE DATASET
  • DELETE DATASET

 

OPEN DATASET

Синтаксис:

OPEN DATASET dset FOR access IN mode [position] [os_additions] [error_handling].

Данный оператор открывает файл, указанный в dset, для доступа указанного в access и режиме хранения mode. Dset – символьная переменная, в которой будет правильное, с точки зрения ОС, физическое имя файла. Файл нельзя открывать более одного раза, без закрытия, иначе система вызовет исключение (для юникодных систем).

Дополнения position, os_additions, error_handling  указывают, с какой позиции начинать обработку файла, дополнения зависимые от ОС сервера приложений и поведение, связанное с обработкой ошибочных ситуаций.

Особенности:

  • Количество файлов одновременно обрабатываемых не может превышать 100, для одной сессии.
  • При открытии набора срабатывают автоматические проверки полномочий (рассмотрены выше).
  • Если имя файла приходит откуда-то извне, необходимо его проверить, чтобы не подвергать систему риску, связанному с обходом доступа к директориям:

В приведенном ниже примере демонстрируется программа, в которой существует возможность обхода полномочий, так как нет проверки (уязвимость проявляет себя, когда в качестве части пути указываются «../» или «..\»):

Возвращаемые значения поля ошибки, после вызова оператора:

sy-subrc Значение
0 Файл был открыт.
8 ОС не смогла открыть файл.

 

Обрабатываемые исключения

CX_SY_FILE_OPEN

Причины: Файл уже открыт.

Ошибка времени выполнения: DATASET_REOPEN

CX_SY_CODEPAGE_CONVERTER_INIT

Причина: Желаемое преобразование невозможно. (Либо неверно указана желаемая кодировка, либо указанная кодировка не поддерживается на уровне системы)

Ошибка времени выполнения: CONVT_CODEPAGE_INIT

CX_SY_CONVERSION_CODEPAGE

Причина: Преобразование невозможно.

Ошибка времени выполнения: CONVT_CODEPAGE

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу

Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

Причина: Нет доступа к открытию канала,  OPEN DATASET с дополнением FILTER.

Ошибка времени выполнения: OPEN_PIPE_NO_AUTHORITY

CX_SY_PIPES_NOT_SUPPORTED

Причина: ОС не поддерживает именованные каналы.

Ошибка времени выполнения: DATASET_NO_PIPE

CX_SY_TOO_MANY_FILES

Причина: Достигнуто максимальное число открытых файлов.

Ошибка времени выполнения: DATASET_TOO_MANY_FILES

 

Не обрабатываемые исключения

Причина: Именованный канал уже открыт.

Ошибка времени выполнения: DATASET_PIPE_POSITION

 

Дополнение access

  … INPUT

| OUTPUT
| APPENDING
| UPDATE … .

Дополнение указывает тип доступа, т.е. каким образом открывается файл: на чтение, запись, добавление или изменение. В юникодных системах указание данного дополнения является обязательным.

  •  INPUT – открывает файл для чтения. По умолчанию указатель внутри файла выставляется на начало файла (при работе с файлами важно понимать, что обычно они обрабатываются не целиком, а частями. Для того чтобы определить необходимое начало и конец, обрабатываемой части файла служит файловый указатель.). Если указанный файл не существует, поле sy-subrc будет равно 8. В юникодных программах запрещено вести запись в открытый для чтения файл, для не юникодных программ это ограничение не действует, однако для совместимости необходимо его соблюдать.
  • OUTPUT – открытие файла для записи. Если файл существовал ранее, его содержимое удаляется. Если файл не существует, он создается. Чтение так же разрешено.
  • APPENDING – открытие файла для добавления. Если файл уже существовал, он откроется,  указатель будет перемещен в конец файла. Если файл не существовал, он создается. Попытка чтения файла оператором READ DATASET будет прервана, sy-subrc возвратит 4.
  • UPDATE – открытие файла для обновления существующего содержимого. По умолчанию указатель будет выставлен в начало файла. Если указанный файл не существует, sy-subrc возвратит значение равное 8.

 

Дополнение mode

Данное дополнение указывает на то, работаем ли мы с текстовым файлом или с бинарным. Атрибут LEGACY используется в том случае, когда мы хотим обеспечить совместимость с не юникодными системами.

Синтаксис:

… {BINARY MODE}

| {TEXT MODE encoding [linefeed] }
| {LEGACY BINARY MODE [endian] [CODE PAGE cp]}
| {LEGACY TEXT MODE [endian] [CODE PAGE cp] [linefeed]} … .

  •  BINARY MODE  — открывает файл как бинарный файл. При записи или чтении, бинарное представление переменных переносится в файл (из файла) в неизменном состоянии.
  • TEXT MODE – открывает файл как текстовый. Дополнение Encoding указывает на формат символьного представления (см. ниже). Когда происходит запись в файл, содержимое переменных преобразовывается в соответствии с форматом определенным в Encoding, после чего переносится в файл. Если переменная является символьной (clike) или плоской структурой, пробелы на концах обрезаются. Если используется строковый тип, пробелы не обрезаются. При записи данных, по умолчанию вставляется зависимый от платформы символ конца строки.

Считывание происходит до символа конца строки, затем указанные символы преобразуются в соответствии с форматом определенным в Encoding, в текущий формат для сервера и записываются в переменную. Обработка символов конца строки зависит от дополнения linefeed.  Для юникодных программ, в данном режиме, при передаче или считывании из файла, могут быть использованы только символьные типы, кроме того необходимо обязательное указание дополнения encoding. В не юникодных программах дополнение encoding не обязательно. При перемещении указателя, при работе с текстовым файлом происходит перемещение на указанное количество символов, а не байт.

  • LEGACY – разница с простым открытием в том, что в данном случае можно задать кодовую страницу, через атрибут CODE PAGE и порядок байт, в атрибуте endian.  В режиме LEGACY TEXT MODE пробелы в символьных (clike) переменных или плоских структурах обрезаются.

 

Дополнение linefeed

Дополнение linefeed имеет следующий синтаксис:

… WITH { NATIVE 

| SMART
| UNIX
| WINDOWS } LINEFEED … .

При использовании данного дополнения, профильный параметр abap/NTfmode (тр. RZ11) игнорируется. Нельзя использовать данное дополнение с дополнением TYPE, если его значение «NT» или «UNIX».

Если данное дополнение не используется, правила определения символа конца строки зависят от текущего сервера приложений и платформы, на которой он запущен:

  • Для UNIX систем (Unix, OS/390, и IBM i5/OS) это «LF».
  • Для Windows – «CRLF». Кроме того для Windows систем может быть использован параметр abap/NTfmode, который определяет какой символ конца строки использовать для новых файлов. Если его значение «b» — используется маркер «LF». Если его значение «t» или пустое – используется маркер «CRLF». Данный параметр может быть переопределен в дополнении TYPE и значением для его «NT» или «UNIX». Если существующий файл был открыт без дополнения TYPE, происходит поиск маркера, если маркер был найден, он и будет использоваться для всего файла. Если маркер не был найден, будет использоваться профильный параметр  abap/NTfmode.

Если дополнение было указано при открытии файла, оно может быть перезаписано, через оператор SET DATASET.

SAP рекомендует указывать дополнение linefeed, т.к. если его не указать логика определения указателя конца строки будет зависеть от множества факторов: ОС сервера приложений, профильный параметр, существующий символ в имеющемся файле.

Значения, указываемые в дополнении:

  • NATIVE – в зависимости от ОС на сервере приложений (см. выше)
  • SMART – данное дополнение зависит от типа доступа к файлу:
    • Если файл открыт на чтение (FOR INPUT), оба маркера будут обрабатываться. При открытии EBCDIC файла так же обрабатывается маркер «NL» (new line).
    • Если файл открыт для дополнения или для обновления (APPENDING, UPDATE) происходит поиск маркера, который уже был использован в файле. Найденный маркер далее используется для записи. Если маркер не будет найден, будет использован маркер для ОС сервера приложений (как с дополнением NATIVE).
    • Если файл открывается для записи (OUTPUT), маркер определяется в зависимости от ОС сервера приложений (как с дополнением NATIVE).
    • UNIX – используется «LF» маркер
    • WINDOWS – используется «CRLF» маркер

 

Дополнение CODEPAGE

Синтаксис:

…  CODE PAGE cp …

Указывает кодовую страницу, в которой представлены данные файла. Когда данные переносятся из файла в ABAP, происходит автоматическая конвертация в кодовую страницу, использующуюся на сервере приложений (если они не идентичны). При записи происходит аналогичная конвертация в указанную в дополнении кодировку.

В юникодных системах происходит преобразование символов из указанной кодовой страницы в юникодные символы, в соответствии с текущим форматом на сервере приложений.

В качестве параметра cp необходимо использовать переменную со значением из столбца CPCODEPAGE в таблице TCP00.

codepages

Дополнение ENCODING

Синтаксис:

ENCODING { DEFAULT 
             | {UTF-8 [SKIPPING|WITH BYTEORDER MARK]} 
             | NONUNICODE } … .

Определяет формат, используемый для текстовых файлов.  Данное дополнение обязательно для юникодных систем, в не юникодных может быть опущено (по умолчанию примет значение NON-UNICODE).

SAP рекомендует всегда использовать UTF-8 при работе с текстовыми файлами. Так как кодовые страницы не всегда можно идентифицировать относительно содержимого файла.

Может принимать следующие значения:

  • DEFAULT – в юникодных системах тоже самое что и UTF-8, для не юникодных систем NON-UNICODE.
  • UTF-8 [SKIPPING|WITH BYTE-ORDER MARK] – файл обрабатывается в соответствии с кодировкой UTF-8. С помощью дополнения указывается, необходимо ли обрабатывать символ порядка байт (BOM):
    • SKIPING BYTE-ORDER MARK – используется только если файл открывается для чтения или изменения, если в файле присутствует данный символ указатель переводится на позицию после него, без дополнения файл обрабатывается как обычно.
    • WITH BYTE-ORDER MARK – используется для файлов открытых на запись (OUTPUT), если дополнение указано символ вставляется автоматически в начало файла, если не указано символ не будет вставлен.
    • NON-UNICODE – для не юникодных систем, данные переносятся в файл (из файла) без дополнительной конвертации. В юникодной системе, происходит преобразование в соответствии с настроенным присвоением, таблица TCP0C.

cpconvert

Дополнение BYTE-ORDER MARK не может использоваться одновременно с дополнением position (см. ниже).

Рекомендации SAP:

  • При открытии UTF-8 файлов на чтение желательно всегда пропускать символ порядка байт, использовать SKIPING дополнение.
  • При записи в UTF-8 файл, желательно всегда записывать метку с дополнением WITH BYTE-ORDER MARK.
  • С помощью класса CL_ABAP_FILE_UTILITIES и его метода  CREATE_UTF8_FILE_WITH_BOM, можно создать UTF-8 файл с меткой BOM. С помощью метода CHECK_UTF8 можно определить есть ли метка в указанном файле.

UTF-16 файлы могут быть открыты только как бинарные файлы.

Дополнение endian

Синтаксис:

… {BIG|LITTLE} ENDIAN …

Дополнение указывает порядок байтов при записи числовых переменных ABAP (i, decfloat16, decfloat34, f, или s).

 

Дополнение position

Синтаксис:

AT POSITION pos … .

Переводит указатель файла на указанное в переменной POS число байт. Если в качестве позиции передать -1, указатель будет переведен в конец файла.

Следует знать следующие особенности:

  • Если файл открыт на чтение и значение в pos больше размера файла, указатель становится неопределенным и чтение в таком  случае будет невозможно, до тех пор, пока указатель не будет переведен в пределы размера файла. Если файл обрабатывается в не юникодной системе и происходит запись в него, все последующие от конца файла байты до указателя будут заполнены 16-ричным представлением 0, а запись начнется со следующего байта.
  • Если файл открыт для записи, все символы с начала файла, до указанной позиции заполняются 16-ричным представлением 0 и запись происходит со следующего байта.
  • Если файл открывается для добавления (APPENDING), данное дополнение игнорируется, указатель выставляется в конец файла.
  • Если файл открывается для изменения и позиция указана больше размера файла в байтах, все байты с конца файла по указанную позицию заполняются 16-ричным представлением 0 и запись происходит со следующего байта после указанной позиции.

Дополнение не может быть использовано одновременно с дополнениями FILTER и BYTE-ORDER MARK.

 

Дополнения os_additions

Синтаксис:

… [TYPE attr]
    [FILTER opcom] … .

Данные дополнения указывают на специфические для ОС параметры при обработке файлов.

  • Дополнение TYPE attr – зависит от ОС, используемой на сервере приложений. Если ОС не MS Windows, символьное значение, определенное в attr, содержит зависимые от ОС параметры для файла, который должен обрабатываться. Для MS Windows в этот параметр, при работе с текстовыми файлами или текстовыми файлами в режиме совместимости, может быть передан идентификатор символа конца строки: «NT» для CRLF «UNIX» для LF, но только в том случае, если не указано дополнение linefeed. Все остальные значения в данном параметре будут проигнорированы для MS Windows.

Пример использования дополнения в ОС IBM i5/OS:

  • Дополнение FILTER opcom – данное дополнение поддерживается для ОС (Unix, Windows), работающих с так называемыми именованными каналами (pipes). За более подробной информацией можете обратиться к справке по данному дополнению.

 

Дополнения error_handling

Синтаксис:

… [MESSAGE msg]
    [IGNORING CONVERSION ERRORS]
    [REPLACEMENT CHARACTER rc] … .

В случае возникновения ошибок, данные дополнения позволяют получать эти ошибки, подавлять некоторые ошибки, определять символы замены для неизвестных символов.

  • Дополнение MESSAGE msg. В случае возникновения ошибки на уровне сервера приложения, в символьную переменную msg будет записан код ошибки, пример:

  • Дополнение IGNORING CONVERSION ERRORS. Данное дополнение может быть использовано для подавления исключения CX_SY_CONVERSION_CODEPAGE. Данное исключение возникает, если при работе с файлом невозможно сделать преобразование из одной кодовой страницы в другую. Данное дополнение используется только при обработке текстовых файлов, текстовых файлов в режиме совместимости и бинарных файлов в режиме совместимости, но не для бинарных файлов. При этом каждый не конвертируемый символ заменяется по умолчанию символом «#», либо символом, указываемым в следующем дополнении.
  • REPLACEMENT CHARACTER rc. В качестве rc указывается символ, на который будут заменены не распознанные символы.

 

TRANSFER

Синтаксис:

TRANSFER dobj TO dset [LENGTH len] 
[NO END OF LINE].

Данный оператор переносит содержимое переменной dobj в файл dset. В качестве переменной может быть использована любая символьная переменная или плоская структура. При обработке бинарного файла используются байтовые типы (x, xstring).  В юникодных программах при записи в текстовый файл может использоваться только символьная переменная (не структура), данное ограничение не распространяется на текстовые файлы, открытые в режиме совместимости.

В качестве dset указывается физическое имя файла. Содержимое dobj передается в файл начиная с текущей позиции указателя. После того, как данные будут перенесены в файл, курсор смесится на следующую позицию после перемещенных данных.

Для записи в юникодных программах, необходимо чтобы файл был открыт для записи, добавления или изменения.  Если файл был не открыт заранее, в не юникодных системах он будет открыт неявно.

В зависимости от типа доступа к файлу, есть определенные особенности:

  • Файл открыт для чтения (FOR INPUT). Нельзя производить запись в юникодных программах. В не юникодных программах запись происходи так же, как если бы он был открыт с типом доступа — FOR UPDATE.
  • Файл открыт для записи (FOR OUTPUT). Запись происходит, начиная с текущей позиции указателя, если указатель был перемещен дальше конца файла, байты с позиции конца файла, по текущую позицию будут записаны 16-ричным представлением 0.
  • Если файл был открыт для добавления (APPENDING) , система начинает вести запись с текущего указателя, при первоначальном открытии указатель находится в конце файла.
  • Файл открыт для изменения (CHANGING). Запись происходит с текущей позиции указателя, если указатель был перемещен дальше конца файла, байты с позиции конца файла, по текущую позицию будут записаны 16-ричным представлением 0. Если часть файла должна быть перезаписана, обязательно открывать с типом доступа CHANGING для юникодных программ. В не юникодных программах, файл, открытый для чтения может быть перезаписан, но SAP не рекомендует этого делать.

Кроме того, на работу оператора влияет  тип содержимого файла:

  • Если файл открыт как текстовый или текстовый в режиме совместимости, любые пробелы на концах символьных переменных обрезаются, кроме переменных с типом string. Если необходимо преобразование, в кодовую страницу отличную от системной, происходит преобразование, затем побайтно идет запись в файл.
  • После записи в файл содержимого из dobj автоматически вставляется метка конца строки, определенная при открытии. Чтобы система не добавляла метку, используется дополнение NO END OF LINE.

Следует знать некоторые особенности:

  • Оператор TRANSFER либо возвращает sy-subrc  = 0, либо вызывает исключение.
  • В не юникодных программах вызов OPEN DATASET перед TRANSFER не обязателен, поэтому в не юникодных программах при вызове оператора TRANSFER срабатывают автоматические проверки доступа к файлу, т.к. происходит неявный вызов OPEN DATASET.

Дополнения:

  • LENGTH len – определяет то, как много байтов или символов (в зависимости от типа содержимого) будет записано в файл.  Для бинарных, текстовых в режиме совместимости и бинарных в режиме совместимости файлов, дополнение определяет количество передаваемых байт.

Если длинна 0 и меньше, ничего не будет записано.  Если количество в len больше количества символов или байт в dobj, вместо недостающих символов (байтов) в файл будут записаны пустые символы (пробелы) или 16-ричное представление 0.

Пример использования оператора TRANSFER:

Обрабатываемые исключения

CX_SY_CODEPAGE_CONVERTER_INIT

Причина: Желаемое преобразование невозможно. (Либо неверно указана желаемая кодировка, либо указанная кодировка не поддерживается на уровне системы)
Ошибка времени выполнения: CONVT_CODEPAGE_INIT

CX_SY_CONVERSION_CODEPAGE

Причина: Преобразование невозможно.
Ошибка времени выполнения: CONVT_CODEPAGE

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу
Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

CX_SY_FILE_IO

Причина: Ошибка при записи в файл.
Ошибка времени выполнения: DATASET_WRITE_ERROR

CX_SY_FILE_OPEN

Причина: Файл не может быть открыт.
Ошибка времени выполнения: DATASET_CANT_OPEN

CX_SY_FILE_OPEN_MODE

Причина: Файл не был открыт для указанного типа доступа.
Ошибка времени выполнения: DATASET_NOT_OPEN

Причина: Файл открыт в юникодной программе с использованием OPEN DATASET … FOR INPUT и не может использоваться для записи.
Ошибка времени выполнения: DATASET_READ_ONLY

CX_SY_PIPE_REOPEN

Причина: Рабочий процесс, в котором был открыт файл с именованным каналом либо закрыт, либо переключен.
Ошибка времени выполнения: DATASET_PIPE_CLOSED

CX_SY_TOO_MANY_FILES

Причина: Достигнуто максимальное число открытых файлов.
Ошибка времени выполнения: DATASET_TOO_MANY_FILES

 

READ DATASET

Синтаксис:

READ DATASET dset INTO dobj [MAXIMUM LENGTH mlen]
                           [[ACTUAL] LENGTH alen].

Данный оператор производит чтение из файла dset в переменную dobj. В качестве переменной может выступать либо переменная с элементарным типом, либо переменная с типом плоской структуры. В юникодных программах обязательно чтобы переменная была символьной, если файл открыт как текстовый. Чтение происходит с текущей позиции указателя в файле. После того как чтение осуществлено, указатель перемещается на длину считанных данных.

В юникодных программах для того чтобы производить чтение из файла, он должен быть открыт с любым типом доступа.  Если файл не был открыт в не юникодной программе, его открытие происходит неявным образом.

На работу оператора влияет тип содержимого в файле:

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

Если переменная dobj слишком коротка относительно считываемых символов, лишние символы обрезаются. Если же она длиннее, переменная заполняется пробелами справа. Если же dobj строковая переменная (тип string) в неё передаются только считанные символы.

  • Если файл открыт как бинарный или как бинарный в режиме совместимости, система считывает ровно столько байтов, сколько может уместиться в переменной dobj. Файловый указатель так же перемещается по мере считывания. Если переменная dobj больше размеров файла, она заполняется 16-ричным представлением 0 справа. Если dobj строка, система пытается считать весь файл в переменную.

Если при открытии файла указана необходимость в конвертации кодировок, она срабатывает до присвоения данных переменной, после чего в неё побайтно передаются сконвертированные данные.

Заполнение поля sy-subrc

Для текстовых файлов

sy-subrc Значение
0 Данные считаны до явно определенной метки конца строки или до неявной метки конца строки в конце файла.
4 Была сделана попытка чтения данных после конца файла.

Для бинарных файлов

sy-subrc Значение
0 Данные были считаны; при этом система либо достигла конца файла, либо нет
4 Либо была совершена попытка чтения после конца файла, либо переменная в которую происходит чтение оказалась длиннее его содержимого

Существуют следующие особенности:

  • Так как в не юникодных программах открытие файла может происходить не явно, для них вызывается автоматическая проверка полномочий.
  • Текстовый файл без явно записанных меток конца строки, всегда имеет неявную метку конца строки в конце файла.
  • При переносе цифровых данных или смешанных структур рекомендуется считывать данные в ссылочную переменную байтового типа, присвоенную с помощью дополнения CASTING (ниже будет показан альтернативный способ считывания, непосредственно в байтовый буфер):

Дополнения:

  • [ACTUAL] LENGTH alen  — записывает считанный объем данных в переменную alen. Для текстовых – количество символов, для бинарных и в режиме совместимости – количество байт.  Слово ACTUAL было введено, чтобы отличать это дополнение от следующего и должно быть всегда использовано.
  • MAXIMUM LENGTH mlen определяет, как много символов (байт) будет считано из файла. Для текстовых – количество символов, для бинарных и в режиме совместимости – количество байт. Пример:

Обрабатываемые исключения

CX_SY_CODEPAGE_CONVERTER_INIT

Причина: Желаемое преобразование невозможно. (Либо неверно указана желаемая кодировка, либо указанная кодировка не поддерживается на уровне системы)
Ошибка времени выполнения: CONVT_CODEPAGE_INIT

CX_SY_CONVERSION_CODEPAGE

Причина: Преобразование невозможно.
Ошибка времени выполнения: CONVT_CODEPAGE

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу
Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

CX_SY_FILE_IO

Причина: Ошибка при чтении файла.
Ошибка времени выполнения: DATASET_READ_ERROR

CX_SY_FILE_OPEN

Причина: Файл не был открыт.
Ошибка времени выполнения: DATASET_CANT_OPEN

CX_SY_FILE_OPEN_MODE

Причина: Файл не был открыт для указанного режима.
Ошибка времени выполнения: DATASET_NOT_OPEN

CX_SY_PIPE_REOPEN

Причина: Рабочий процесс, в котором был открыт файл с именованным каналом либо закрыт, либо переключен.
Ошибка времени выполнения: DATASET_PIPE_CLOSED

 

GET DATASET

Синтаксис:

GET DATASET dset [POSITION pos] [ATTRIBUTES attr].

Данный оператор необходим для получения информации о наборе данных dset. При работе с ним, системное поле с кодом ошибки (sy-subrc) всегда равно 0, однако могут быть вызваны исключения (см. ниже)

Если вызывать оператор без дополнений, он может использоваться для проверки, был ли открыт набор данных ранее, если нет, система вызовет исключение.

Дополнения:

  • POSITION pos  — считывает в переменную pos, с типом i, текущий адрес указателя в файле. Позиция указателя всегда определена в байтах. Если позиция находится в начале файла, значение в переменной будет равно 0. Данное дополнение, не может быть одновременно использовано с описанным выше дополнением FILTER (система вызовет исключение). Для файлов, чей размер превышает 2 ГБ, невозможно получить все позиции указателя в файле. (не хватит диапазона типа i). Пример:

  •  ATTRIBUTES attr  — считывает атрибуты открытого набора данных. В качестве attr используется переменная с типом dset_attributes:

attr

Данная структура имеет два компонента, фиксированные атрибуты и изменяемые атрибуты. Изменяемые атрибуты можно поменять с помощью оператора SET DATASET (см. ниже). В следующем примере проверяется, открыт ли файл с дополнением FILTER, если нет, можно считать указатель файла:

Обрабатываемые исключения

  • CX_SY_FILE_OPEN_MODE — файл не открыт.
  • CX_SY_FILE_POSITION – невозможно получить позицию указателя файла.
  • CX_SY_CONVERSION_OVERFLOW – переменная pos слишком мала, чтобы в неё можно было записать позицию указателя.

 

SET DATASET

Синтаксис:

SET DATASET dset [POSITION {pos|{END OF FILE}}]
[ATTRIBUTES attr].

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

Дополнения:

  • [POSITION {pos|{END OF FILE}}] – перемещает указатель файла на позицию указанную в переменной pos, с типом i, либо если указано END OF FILE на конец файла. Если в переменной pos будет 0, указатель переместиться в начало файла, если – 1 в конец. Другие отрицательные значения не разрешается использовать. В зависимости от типа доступа, в котором открыт файл, есть некоторые особенности:
    • Если файл открыт для чтения, и позиция pos будет больше чем длинна файла, указатель будет перемещен вне файла, считать данные не получится до тех пор, пока указатель не будет перемещен в тело файла. Если в не юникодной программе совершить при этом запись, файл с конца будет заполнен 16-ричным представлением 0 до текущей позиции, после чего произойдет запись.
    • Если файл был открыт для записи или изменения и курсор был перемещен за пределы файла, при записи в него, с конца файла до текущей позиции он будет заполнен 16-ричным представлением 0, затем произойдет запись.
    • Если файл был открыт для добавления, позиция указателя в нем всегда остается в его конце.

Данное дополнение не может быть использовано, если файл был открыт с дополнением FILTER. Для файлов более 2 ГБ, невозможно определить позицию указателя.  Произвольное перемещение указателя больше подходит для бинарных файлов, чем для текстовых. В текстовых файлах позиция будет зависеть от кодировки, символов конца строки, использования юникода, а так же метки порядка байт.  Пример использования дополнения:

  • ATTRIBUTES attr – устанавливает изменяемые атрибуты. Для некоторых из изменяемых атрибутов существуют константы из пула типов DSET:

attr2

Пример:

Обрабатываемые исключения

CX_SY_CODEPAGE_CONVERTER_INIT

Причина: Желаемое преобразование невозможно. (Либо неверно указана желаемая кодировка, либо указанная кодировка не поддерживается на уровне системы)
Ошибка времени выполнения: CONVT_CODEPAGE_INIT

CX_SY_CONVERSION_CODEPAGE

Причина: Изменение символов замены и обработки ошибок возможно лишь для файлов открытых в TEXT MODE или LEGACY … MODE.
Ошибка времени выполнения: CONVT_CODEPAGE

CX_SY_FILE_OPEN_MODE

Причина: Файл открыт на чтение, изменение невозможно
Ошибка времени выполнения: DATASET_READ_ONLY

Причина: Файл не был открыт.
Ошибка времени выполнения: DATASET_NOT_OPEN

Причина: Файл открыт в неподдерживаемом режиме.
Ошибка времени выполнения: DATASET_INCOMPATIBLE_MODE

CX_SY_FILE_POSITION

Причина: Ошибка при смене указателя.
Ошибка времени выполнения: DATASET_SEEK_ERROR

Причина: Нет доступа для смены позиции.
Ошибка времени выполнения: DATASET_NO_POSITION

Причина: Перемещение невозможно на указанную позицию, слишком большая позиция.
Ошибка времени выполнения: DATASET_OFFSET_TOO_LARGE

Не обрабатываемые исключения

Причина: Невозможно изменить позицию для именованного канала.
Ошибка времени выполнения: DATASET_PIPE_POSITION

 

TRUNCATE DATASET

Синтаксис:

TRUNCATE DATASET dset AT {CURRENT POSITION}|{POSITION pos}.

С помощью данного оператора можно изменить размер файла (уменьшить или увеличить). Уменьшается когда позиция указателя после AT меньше текущего размера файла, увеличивается, когда больше. При увеличении размера файл заполняется 16-ричным представлением 0.

Оператор можно использовать, если файл открыт на запись, изменение или дополнение, а так же не указано дополнение FILTER.

Оператор всегда возвращает sy-subrc равное 0, либо вызывает исключение. Оператор не устанавливает новую позицию для указателя в файле. Если файл открыт для добавления, указатель перемещается непосредственно перед записью в файл.

Дополнения:

  • CURRENT POSITION  — устанавливает конец в файла в текущей позиции
  • POSITION pos – устанавливает конец файла в указанной в pos позиции. В pos может быть передана любая числовая переменная, если её значение целое и не отрицательное.

Пример использования оператора TRUNCATE:

После первого вызова оператора в файле останется значение «FF», после второго «FF00».

Обрабатываемые исключения

CX_SY_FILE_OPEN

Причина: Файл не был открыт.
Ошибка времени выполнения: DATASET_NOT_OPEN

Причина: Файл открыт только для чтения.
Ошибка времени выполнения: DATASET_READ_ONLY

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу
Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

CX_SY_FILE_POSITION

Причина: Указана неверная позиция.
Ошибка времени выполнения: DATASET_OFFSET_TOO_LARGE

CX_SY_FILE_TRUNCATE

Причина: ОС не может изменить размер файла.
Ошибка времени выполнения: DATASET_TRUNCATE_ERROR

Причина: Невозможно изменить размер файла, открытого с дополнением FILTER.
Ошибка времени выполнения: DATASET_TRUNCATE_ERROR

Не обрабатываемые исключения

Причина: Внутренняя ошибка.
Ошибка времени выполнения: DATASET_TRUNCATE_ERROR

 

CLOSE DATASET

Синтаксис:

CLOSE DATASET dset.

Оператор закрывает набор данных. Если файл уже был закрыт или еще не открыт, система игнорирует данный оператор, sy-subrc равен 0.  Если в ОС используется буфер при изменении файла, все что было в нем, переносится в файл.  Если при закрытии программы не было явного вызова закрытия набора данных, он закрывается автоматически.

Если файл открыт с дополнением FILTER, при его закрытии sy-subrc содержит код возврата из именованного канала, возвращаемый ОС. Если не было исключений sy-subrc равно 0.

Обрабатываемые исключения

CX_SY_FILE_CLOSE

Причина: Файл не был закрыт. Возможной причиной является недостаток памяти.
Ошибка времени выполнения: DATASET_CANT_CLOSE

 

DELETE DATASET

Синтаксис:

DELETE DATASET dset.

Удаляет указанный файл, при этом он может быть закрыт или открыт.  Если имя файла приходит извне, оно может нести серьезный риск из-за обхода директорий (см. выше) и требует дополнительной проверки.

Если значение поля sy-subrc равно 0, файл был удален. Если значение поля sy-subrc равно 4, файл не был удален.

Обрабатываемые исключения

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу
Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

CX_SY_FILE_OPEN

Причина: Файл не может быть открыт
Ошибка времени выполнения: DATASET_CANT_OPEN

 

Дополнительные операции при работе с файлами

Файловый интерфейс ABAP не предоставляет таких возможностей, как: переименовать файл (без его копирования в другой файл), листинга в директориях на сервере приложений,  копирования файла без его полного считывания через сервер приложений и др. Большинство этих операций выполняются на уровне системных команд сервера приложений, таких как: cp, mv, mkdir и других.

Для демонстрации работы данных операций можно посмотреть программу ZAL11, которая является заменой стандартной тр. AL11, но с более продвинутыми возможностями:

zall11

Так, например, выглядит процедура копирования (перемещения) файла (директории):

Вызов системных команд подобным образом, не является безопасным, подробнее читайте в блоге.