Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

ГЛАВА 11 - Файлы данных

  • Структура файла данных
    • FILE (описание структуры файла данных)
    • CREATE (разрешает создание файла)
    • DRIVER (задает тип файла данных)
    • ENCRYPT (шифровать файл данных)
    • OWNER (задает пароль для шифрования файла данных)
    • RECLAIM (использовать место от удаленных записей)
  • Операторы структуры файла
    • INDEX (описывает статический индекс для файла)
    • KEY (описывает динамический индекс (ключ) для файла)
    • MEMO (описывает текстовое поле)
    • RECORD (описывает структуру записи)
  • Атрибуты для INDEX, KEY и MEMO
    • BINARY (MEMO содержит двоичные данные)
    • DUP (разрешить повторяющиеся значения полей ключа)
    • NOCASE (KEY или INDEX - НЕ чувствительны к регистру)
    • OPT (пустые или нулевые ключевые поля отбрасываются)
  • Команды работы с файлами
    • BUILD (построить ключи и/или индексы для файла)
    • CLOSE (закрыть файл данных)
    • COPY (копировать файл данных)
    • CREATE (создать пустой файл данных)
    • EMPTY (очистить файл данных)
    • FLUSH (сбросить буфера ДОС на диск)
    • LOCK (монопольный доступ к файлу)
    • OPEN (открыть файл данных)
    • PACK (физически стереть удаленные записи)
    • REMOVE (стереть файл данных)
    • RENAME (переименовать файл данных)
    • SHARE (открыть файл данных)
    • STREAM (разрешить буферизацию через ДОС)
    • UNLOCK (разблокировать заблокированный файл)
  • Команды работы с записями
    • ADD (добавить новую запись)
    • APPEND (добавить новую запись)
    • DELETE (удалить запись)
    • GET (считать запись по прямому доступу)
    • HOLD (монопольный доступ к записи)
    • NEXT (прочитать следующую запись последовательности)
    • PREVIOUS (прочитать предыдущую запись последовательности)
    • PUT (записать запись обратно в файл)
    • RELEASE (освободить заблокированную запись)
    • RESET (сброс указателя текущей записи)
    • SET (инициировать последовательную обработку файла)
    • SKIP (пропустить записи в последовательности)
  • Функции работы с файлом
    • BOF (начало файла)
    • BYTES (размер файла в байтах)
    • DUPLICATE (проверить на дублирование ключевых полей)
    • EOF (конец файла)
    • POINTER (относительный номер записи)
    • POSITION (номер записи в последовательности)
    • RECORDS (число записей)
    • SEND (отправить сообщение файловому драйверу)
  • Обработка транзакций
    • COMMIT (завершить успешно проведенную транзакцию)
    • LOGOUT (начать транзакцию)
    • ROLLBACK (завершить ошибочную транзакцию)

СТРУКТУРА ФАЙЛА ДАННЫХ

FILE (описание структуры файла данных)


   метка       FILE,DRIVER()[,CREATE][,RECLAIM][,OWNER()][,ENCRYPT]

                        [,NAME()][,PRE()]

   метка          [INDEX()]

   метка          [KEY()]

   метка          [MEMO()]

   [метка]        RECORD

                    fields

                . .

DRIVER Задает тип файла данных. Атрибут DRIVER требуется для всех описаний структуры FILE.
CREATE Позволяет создать файл командой CREATE во время работы программы.
RECLAIM Разрешает повторно использовать место, освобожденное удаленными записями.
OWNER Задает пароль для шифрования данных.
ENCRYPT Шифрует файл данных.
NAME Останавливает имя файла в стандарте ДОС.
PRE Объявляет префикс метки для структуры.
INDEX Объявляет статический индекс файла, который должен быть перестроен во время исполнения.
KEY Объявляет динамически обновляющийся индекс файла.
MEMO Описывает текстовое поле переменной длины до 64K длиной).
RECORD Объявляет структуру записи по полям. Структура RECORD ДОЛЖНА быть в описании каждого файла.
fields Элементы данных в структуре RECORD.

FILE объявляет структуру файла данных. Метка структуры FILE используется в операторах и функциях, работающих с файлами. Структура FILE должна завершаться точкой или оператором END.

Атрибуты структур FILE, KEY, INDEX, MEMO, операторы описания данных и типы данных, которые могу содержаться в файле, целиком зависят от конкретного файлового драйвера. Все, что не поддерживается файловой системой, заданной в атрибуте DRIVER, при открытии файла вызовет сообщение об ошибке файлового драйвера. Атрибуты и (или) типы данных, разрешенных для конкретной файловой системы, перечислены в документации на файловый драйвер.

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

Пример:


   Names     FILE,DRIVER('Clarion')       !Описание структуры файла

   Rec         RECORD

   Name          STRING(20)

             . .                          !Конец описания файла

CREATE (разрешает создание файла)



        CREATE

Атрибут CREATE, в описании файла, позволяет создавать файл на диске оператором CREATE из программы, в которой этот файл описан.

Файлы, описанные без атрибута CREATE, могут быть созданы с помощью Clarion Data Dictionary Administrator.

Пример:


   Names FILE,DRIVER('Clarion'),CREATE!Описываем файл и разрешаем

                                      !его создание

   Rec     RECORD

   Name      STRING(20)

         . .                          !Конец описания файла

DRIVER (задает тип файла данных)


             DRIVER(filetype[,driver string])

filetype Строковая константа, содержащая имя менеджера файлов (Btrieve, Clarion и т.д.).
driver string Строковая константа или переменная. содержащая любые добавочные инструкции для драйвера. Атрибут DRIVER задает, какой драйвер используется для работы с файлом. Атрибут DRIVER требуется во всех описаниях файлов.

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

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

Пример:


   Names     FILE,DRIVER('Clarion')         !Начало описания файла

   Record      RECORD

   Name          STRING(20)

                                            !Конец описания файла

ENCRYPT (шифровать файл данных)



     ENCRYPT

Атрибут ENCRYPT, используемый совместно с атрибутом OWNER, указывает на необходимость шифрования данных в файле. ENCRYPT разрешен ТОЛЬКО с атрибутом OWNER. Даже используя 16-ричный редактор, весьма трудно расшифровать зашифрованные данные.

(С.П.А - Сильно сомневаюсь. Если ключ к шифру задан как в примере для OWNER, то расшифровка - дело нескольких минут.)

Пример:


   Names        FILE,DRIVER('Clarion'),OWNER('Clarion'),ENCRYPT

   Record         RECORD

   Name             STRING(20)

                . .

См. также: OWNER

OWNER (задает пароль для шифрования файла данных)



     OWNER(password)

password Строковая константа или переменная.

Атрибут OWNER задает пароль, который используется атрибутом ENCRYPT для шифрования данных. Реализация метода шифрования зависит от конкретного файлового драйвера.

Пример:


   Customer  FILE,DRIVER('Clarion'),OWNER('abCdeF'),ENCRYPT

                                    !Шифруем данные с

                                    !паролем "abCdeF"

   Record      RECORD

   Name          STRING(20)

             . .

См. также: ENCRYPT

RECLAIM (использовать место от удаленных записей)



     RECLAIM

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

Пример:


   Names FILE,DRIVER('Clarion'),RECLAIM !Помещать новые записи на

                                        !место ранее удаленных.

   Record  RECORD

   Name      STRING(20)

         . .

ОПЕРАТОРЫ СТРУКТУРЫ ФАЙЛА

INDEX (описывает статический индекс для файла)


    метка        INDEX([-][field])[NAME()][,NOCASE][,OPT]

- Знак МИНУС перед компонентой индекса означает, что для полей с этой компонентой, индекс сортируется по убыванию (от больших значений к меньшим), по умолчанию сортировка по возрастанию.
field Метка поля из структуры RECORD файла, для которого строится индекс. Поле - это компонента индекса. Переменные с атрибутом DIM (массивы) нельзя использовать в качестве индексных полей.
NAME Имя файла для индекса.
OPT В индекс не попадут сведения о тех записях, у которых все поля, используемые как компоненты индекса, пусты или содержат нуль.
NOCASE Сортировку проводить без учета регистра.

INDEX описывает "статичный" ключ для файла данных. INDEX обновляется только оператором BUILD. Он используется для доступа к записям в порядке, отличном от физического размещения записей в файле. INDEX можно использовать как для последовательного, так и для произвольного доступа к файлу. В INDEX-е ВСЕГДА разрешены записи с одинаковым значением индексных полей (duplicated entries).

INDEX может строиться на основании более чем одного поля. Порядок, в котором заданы компоненты индекса, определяет порядок сортировки записей по этому индексу. Самые первые компоненты МЕНЕЕ значимы, самые последние - БОЛЕЕ. В общем, файл данных может иметь до 255 индексов (и/или ключей) и каждый индекс может быть длиной до 255 байт (имеется в виду суммарная длина всех полей, задействованных для построения индекса), хотя точное число индексных и ключевых файлов зависит от файлового драйвера.

Если в описании INDEX не заданы имена полей, то создается "динамический" индекс, который позволяет использовать любые поля структуры RECORD в качестве своих компонент, за исключением массивов. Такие компоненты задаются во время исполнения вторым параметром оператора BUILD. Такой подход позволяет произвольно индексировать файлы во время исполнения (С.П.А - и позволяет избежать одинаковых, в целом, процедур, использующих разные порядки сортировки одного и того же файла).

Пример:


   Names    FILE,DRIVER('Clarion'),PRE(Nam)

   NameNdx  INDEX(Nam:Name),NOCASE        !Индекс по имени

   NbrNdx   INDEX(Nam:Number),OPT         !Индекс по номеру

   Rec        RECORD

   Name         STRING(20)

   Number       SHORT

            . .

См. также: KEY, BUILD

KEY (описывает динамический индекс (ключ) для файла)


   метка        KEY([-][field])[NAME()][,NOCASE][,OPT]

- Знак МИНУС перед компонентой ключа означает, что для полей с этой компонентой, индекс сортируется по убыванию (от больших значений к меньшим), по умолчанию сортировка по возрастанию.
field Метка поля из структуры RECORD файла, для которого строится ключ. Поле - это компонента ключа. Переменные с атрибутом DIM (массивы) нельзя использовать в качестве ключевых полей.
NAME Имя файла для ключа.
OPT В ключ не попадут сведения о тех записях, у которых все поля, используемые как компоненты ключа, пусты или содержат нуль.
NOCASE Сортировку проводить без учета регистра.
DUP В файле данных разрешены записи с одинаковыми значениями ключевых полей.

KEY - это индекс файла данных, который автоматически обновляется при добавлении, изменении или удалении записей. Он используется для доступа к записям в порядке, отличном от физического размещения записей в файле. INDEX можно использовать как для последовательного, так и для произвольного доступа к файлу.

KEY может строиться на основании более чем одного поля. Порядок, в котором заданы компоненты ключа, определяет порядок сортировки записей по этому индексу. Самые первые компоненты МЕНЕЕ значимы, самые последние - БОЛЕЕ. В общем, файл данных может иметь до 255 ключей (и индексов) и каждый ключ может быть длиной до 255 байт (имеется в виду суммарная длина всех полей, задействованных для построения ключа), хотя точное число ключевых и индексных файлов зависит от файлового драйвера.

Пример:


   Names    FILE,DRIVER('Clarion'),PRE(Nam)

   NameKey  KEY(Nam:Name),NOCASE,DUP        !Ключ по имени

   NbrKey   KEY(Nam:Number),OPT             !Ключ по номеру

   Rec        RECORD

   Name       STRING(20)

   Number     SHORT

   

      CODE

      Nam:Name = 'Clarion Software'       !Инициализируем ключевое

                                          !  поле

      GET(Names,Nam:NameKey)              !Читаем запись

      SET(Nam:NbrKey)                     !Обрабатывать в порядке

                               !  возрастания поля

                               !  NAM:NUMBER

См. также: SET, GET, INDEX

MEMO (описывает текстовое поле)


     метка        MEMO(длина)[,BINARY][,NAME()]

длина Числовая константа, задающая максимальную длину текста в символах. Должна быть в диапазоне от 1 до 65,536 байт.
BINARY Указывает, что в МЕМО-поле должны храниться двоичные данные.
NAME Задает имя файла, в котором будут находиться МЕМO-поля. Использование этого параметра зависит от файлового драйвера.

(МЕМО - англ. записка, памятка, примечание)

MEMO описывает строковое поле переменной длины, которое хранится на диске. Параметр ДЛИНА задает максимальный размер поля примечаний. МЕМО должно быть описано ПОСЛЕ описания структуры RECORD. Память под буфер МЕМО-полей выделяется при открытии файла, к которому это примечание относится, и освобождается при его закрытии.

Теоретически, можно описать до 255 МЕОМ-полей для каждого файла. Точное же их число и способ их хранения на диске зависит от файлового драйвера. Просматриваются MEMO-поля, обычно, с помощью полей типа TEXT в экранах и отчетах.

Пример:


   Names     FILE,DRIVER('Clarion'),PRE(Nam)

   NameKey     KEY(Nam:Name)

   NbrKey      KEY(Nam:Number)

   Notes       MEMO(4800)          !Примечание длиной до 4800 байт.

   Rec         RECORD

   Name          STRING(20)

   Number        SHORT

             . .

RECORD (описывает структуру записи)


   [метка]      RECORD[PRE()][,NAME()]

                  поля

                .

поля Одно или более описание переменных.
PRE Задает метку-префикс структуры.
NAME Задает внешнее имя структуры RECORD. Использование этого параметра зависит от файлового драйвера.

Оператор RECORD описывает начало структуры файла данных. Структура RECORD обязательно должна быть в описании файла. Каждое ПОЛЕ элемент структуры RECORD. Длина структуры RECORD складывается из длин входящих в нее ПОЛЕЙ. При обращении к структуре RECORD, она рассматривается, как структура типа GROUP.

Во время исполнения, под данные структуры RECORD, выделяется буфер в статической памяти. ПОЛЯ, в буфере записи, дрступны независимо от того открыт файл или нет. Записи считываются в буфер из файла операторами NEXT, PREVIOUS или GET. Данные ПОЛЕЙ обрабатываются, а затем записываются в файл в виде цельной структуры RECORD операторами ADD, PUT или DELETE.

Пример:


   Names    FILE,DRIVER('Clarion')      !Описание структуры файла

   Record     RECORD                    !  начало описания записи

   Name         STRING(20)              !    описываем поле ИМЯ

   Number       SHORT                   !    описываем поле НОМЕР

            . .                   !Конец описаний записи и файла

АТРИБУТЫ ДЛЯ INDEX, KEY И MEMO

BINARY (MEMO содержит двоичные данные)



     BINARY

Атрибут МЕМО-поля BINARY указывает на то, что MEMO-поле может содержать не только текстовые, но и двоичные данные. Обычно, этот атрибут используется для хранения в МЕМО-полях небольших картинок, которые можно выводить в IMAGE-полях на экране.

Пример:


   Names    FILE,DRIVER('Clarion'),PRE(Nam),

   NameKey    KEY(Nam:Name)

   NbrKey     KEY(Nam:Number)

   Picture    MEMO(48000),BINARY		!Двоичное поле длиной

   					!  до 48,000 байт

   Rec        RECORD

   Name         STRING(20)

   Number       SHORT

См. также: MEMO, IMAGE

DUP (разрешить повторяющиеся значения полей ключа)



     DUP

Атрибут DUP, в описании ключа, позволяет иметь в файле несколько записей с одинаковым значением ключевых полей. Если атрибут DUP пропущен, то попытка добавить или перезаписать запись с уже существующими значениями ключевых полей, вызовет ошибку "Такая запись уже есть" ("Creates Duplicate Key"), и запись не будет записана в файл. Во время последовательной обработки по ключу, записи с одинаковыми ключевыми полями обрабатываются в том физическом порядке, в котором их ключевые поля расположены в файле ключа. Операторы GET и SET обращаются к первой записи из тех, что имеют одинаковые ключевые поля. Атрибут DUP НЕ нужен для индексов, поскольку индексы ВСЕГДА допускают дублированные значения ключевых полей.

Пример:


   Names    FILE,DRIVER('Clarion'),PRE(Nam)

   NameKey    KEY(Nam:Name),DUP

                       !Ключ по имени, разрешаем одинаковые имена

   NbrKey     KEY(Nam:Number)

                       !Ключ по номеру. Одинаковые номера запрещены

   Rec        RECORD

   Name         STRING(20)

   Number       SHORT

            . .

NOCASE (KEY или INDEX - НЕ чувствительны к регистру)



     NOCASE

Атрибут NOCASE в описании KEY или INDEX означает, что сортировка полей по алфавиту будет производиться без учета регистра букв. При записи в ключевой файл, все буквы будут приводиться к верхнему регистру. Этот атрибут не влияет на данные, хранящиеся в файле данных и на не буквы.

Пример:


   Names     FILE,DRIVER('Clarion'),PRE(Nam)

   NameKey     KEY(Nam:Name),NOCASE

                           !Ключ по имени без учета регистра

   NbrKey      KEY(Nam:Number)                  !Ключ по номеру

   Rec         RECORD

   Name          STRING(20)

   Number        SHORT

             . .

См. также: INDEX, KEY

OPT (пустые или нулевые ключевые поля отбрасываются)



     OPT

Если задан атрибут ОРТ, то в ключ или индекс НЕ попадут сведения о записях, у которых все ключевые поля пусты. В терминах атрибута ОРТ, "пустое поле" означает, что числовое поле содержит нуль, а символьное - только пробелы.

Пример:


   Names   FILE,DRIVER('Clarion'),PRE(Nam)!Описание структуры файла

   NameKey KEY(Nam:Name),OPT    !Ключ по имени, имя не может быть

                                !  пустым

   NbrKey  KEY(Nam:Number),OPT  !Ключ по номеру. Номера не могут

                                !  быть нулевыми

   Rec       RECORD

   Name        STRING(20)

   Number      SHORT

           . .

См. также: INDEX, KEY

КОМАНДЫ РАБОТЫ С ФАЙЛАМИ

BUILD (построить ключи и/или индексы для файла)


                    | ключ |

             BUILD( |индекс| [,компоненты])

                    | файл |

ключ Метка описания КЛЮЧА.
индекс Метка описания ИНДЕКСА.
файл Метка описания ФАЙЛА.
компоненты Строковая константа или переменная, содержащая список полей, на основе которых построить динамический ИНДЕКС. Имена полей должны разделяться запятыми, перед именем поля должен стоять знак плюс или минус, чтобы задать сортировку по возрастанию или по убыванию.

Оператор BUILD строит ключи и индексы. BUILD(ключ), BUILD(индекс) и BUILD(файл) требуют монопольного доступа к файлу. Т.е., файл должен быть заблокирован (через LOCK) или открыт с кодом доступа 12h (ВСЕМ кроме меня запрещено чтение/запись) или 22h (ВСЕМ кроме меня запрещена запись). BUILD(индекс,компоненты) НЕ требует монопольного доступа к файлу.

BUILD(ключ)
BUILD(индекс)
Строит только указанный КЛЮЧ или ИНДЕКС. Файл должен быть закрыт, заблокирован или открыт в режиме 12h или 22h.
BUILD(файл) Строит все КЛЮЧИ или ИНДЕКСЫ ФАЙЛА. Файл должен быть закрыт, заблокирован или открыт в режиме доступа 12h или 22h.
BUILD(индекс,компоненты) Позволяет строить динамический ИНДЕКС. Эта форма BUILD не требует монопольного доступа к файлу, тем не менее файл должен быть открыт в любом разрешенном режиме доступа. Динамический ИНДЕКС создается как временный файл только для строящего его пользователя. Этот временный файл автоматически удаляется при закрытии файла.

Возвращаемые ошибки:


    37 Файл еще не открыт

    40 Такой ключ уже есть

    63 Требуется монопольный доступ

    76 Неверные параметры для индекса

Пример:


   Names   FILE,DRIVER('Clarion'),PRE(Nam)!Описание структуры файла

   NameKey   KEY(Nam:Name).OPT            !Описание ключа по имени

   NbrNdx    INDEX(Nam:Number),OPT        !Описание индекса по но-

   				       !  меру

   DynNdx    INDEX()                      !Описываем динамический

   				       !  индекс

   Rec       RECORD

   Name        STRING(20)

   Number      SHORT

           . .

       CODE

       OPEN(Names,12h)             !Открываем файл с исключительным

   				!  правом чтения/записи

       BUILD(Names)                !Строим все ключи для файла имен

       BUILD(Nam:NbrNdx)           !Строим индекс по номеру

       BUILD(Nam:DynNdx.'-Nam:Number,+Nam:Name')

             !Строим динамический индекс - по номеру с убыванием,

   	  !  по имени с возрастанием.

См. также: OPEN, SHARE

CLOSE (закрыть файл данных)



     CLOSE(файл)

файл Метка ФАЙЛА.

Оператор CLOSE закрывает ФАЙЛ. Обычно, это вызывает сброс дисковых буферов на диск и освобождение памяти, выделенной под них, кроме буфера, хранящего данные структуры RECORD. Точный порядок закрытия файла зависит от файлового драйвера.

Пример:


     CLOSE(Customer)                        !Закрыть файл покупателей

COPY (копировать файл данных)



     COPY(файл,новый_файл)

файл Метка копируемого файла.
новый_файл Строковая константа или переменная, содержащая полную спецификацию файла (диск, каталог и имя). Если в спецификации отсутствуют диск и каталог, то подразумеваются текущий каталог текущего диска. Если указан только путь, то для имени НОВОГО_ФАЙЛа используются имя и расширение копируемого ФАЙЛа.

Оператор COPY создает копию файла, и делает соответствующую запись в каталоге. Копируемый ФАЙЛ должен быть закрыт, иначе будет возвращена ошибка "Файл уже открыт". Если спецификация НОВОГО_ФАЙЛа совпадает со спецификацией оригинала, то такой оператор COPY игнорируется.

Поскольку некоторые файловые драйверы используют несколько физических ФАЙЛОВ для работы с ними как с ОДНИМ ФАЙЛОМ, то подразумеваемые имя и расширение файла зависят от файлового драйвера. Если происходит какая-либо ошибка, то файл не копируется.

Возвращаемые ошибки:


       02 Файл не найден

       03 Путь не существует

       05 Доступ запрещен

       52 Файл уже открыт

Пример:


    COPY(Names,'A:\')          !Копируем файл имен на дискету

    COPY(CompText,Filename)    !Копируем текстовый файл под другим

                               !  именем

CREATE (создать пустой файл данных)



     CREATE(файл)

файл Метка файла, который надо создать.

Оператор CREATE создает в заданном каталоге пустой файл данных. Если файл уже существует, то он удаляется и пересоздается как файл, не содержащий данных. Файл должен быть закрыт, иначе возникает ошибка "Файл уже открыт". CREATE не оставляет созданный файл открытым.

Возвращаемые ошибки:


    03 Путь не существует

    04 Слишком много открытых файлов

    05 Доступ запрещен

    52 Файл уже открыт

    54 Нет атрибута CREATE

Пример:


    CREATE(Master)         !Создать новый основной файл

    CREATE(Detail)         !Создать новый файл подробностей

EMPTY (очистить файл данных)



     EMPTY(файл)

файл Метка существующего файла.

EMPTY удаляет ВСЕ записи из заданного файла. EMPTY требует монопольного доступа к файлу. То есть файл должен быть открыт в режиме доступа 12h (всем, кроме меня запрещены чтение/запись) или 22h (всем, кроме меня запрещена запись)

Возвращаемые ошибки:


     63 Требуется монопольный доступ

Пример:


   OPEN(Master,18)                       !Открыть основной файл

   EMPTY(Master)                         !  и опустошить его

См. также: OPEN, SHARE

FLUSH (сбросить буфера ДОС на диск)



     FLUSH(файл)

файл Метка файла.

Оператор FLUSH завершает операцию STREAM. Он сбрасывает буфера ДОС, что приводит к обновлению записи каталога для данного файла. Поддержка этого оператора зависит от файловой системы и конкретные результаты этой команды описаны в документации по файловому драйверу.

Пример:


   STREAM(History)                 !Используем буфера ДОС

   SET(Current)                    !Идем в начало файла CURRENT.

   LOOP UNTIL EOF(Current)

     NEXT(Current)

     His:Record - Cur:Record

     ADD(History)

   .                               !Конец цикла

   FLUSH(History)                  !Заканчиваем  поточную  обра-

				   !  ботку и сбрасываем буфера.

См. также: STREAM

LOCK (монопольный доступ к файлу)



     LOCK(файл[,секунды])

файл Метка файла, открытого для совместного доступа.
секунды Числовая константа или переменная, которая задает максимальное время ожидание в секундах.

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

LOCK(файл) Пытается заблокировать файл до тех пор, пока это не удастся. Если файл уже заблокирован другой станцией, то LOCK будет ждать, пока та станция не разблокирует файл.
LOCK(файл,секунды) Если за заданное время не удалось заблокировать файл, то возвращается ошибка "Файл уже заблокирован".

Главная проблема с блокированными файлами, это как избежать "смертельного объятия". Это происходит, когда две станции пытаются заблокировать один и тот же набор файлов в разной последовательности, и обе используют оператор LOCK(файл). Одна станция уже заблокировала файл, который хочет заблокировать другая, и наоборот. Этой проблемы можно избежать, если использовать оператор LOCK(файл,секунды) и всегда блокировать файлы в одном и том же порядке.

Возвращаемые ошибки:


       32 Файл уже заблокирован

Пример:


   LOOP                      !Цикл во избежание "смертельного

   			     !  объятия"

     LOCK(Master,1)          !1 секунду пытаемся заблокировать

			     !  основной файл

     IF ERRORCODE() = 201    !Если кто-то уже блокирует его, то

       BEEP(0,100)           ! ждем секунду и

       CYCLE                 ! пытаемся снова...

     .

     LOCK(Detail,1)          !За секунду пытаемся заблокировать

			     !  файл подробностей



     IF ERRORCODE() = 201    !Если кто-то уже блокирует его, то

       UNLOCK(Master)        !  разблокируем занятый нами файл,

       BEEP(0,100)           !  подождем секунду и

       CYCLE                 !  еще разок попробуем

   . .                       !Конец операторов IF и LOOP

OPEN (открыть файл данных)



     OPEN(файл[,режим доступа])

файл Метка файла.
режим доступа Числовая константа, переменная или выражение, задающее уровень доступа к файлу как для открывающего его пользователя, так и для остальных пользователей многопользовательской системы. Если пропущен, то подразумевается 22h (всем, кроме меня запрещена запись в этот файл)

Оператор OPEN открывает структуру FILE для обработки и устанавливает режим доступа. Поддержка различных уровней доступа зависит от файлового драйвера. Все файлы должны быть явно открыты перед их использованием. РЕЖИМ ДОСТУПА это битовая карта, указывающая операционке, какой доступ предоставить открывающему пользователю, и какой доступ запретить для остальных потенциальных пользователей этого файла. Допустимы следующие значения режима доступа:

  Дес. 16н. Режим доступа
Открывающий пользователь 0 0h Только для чтения (Read Only)
1 1h Только для записи (Write Only)
2 2h Для чтения и записи (Read/Write)
Остальные пользователи 0 0h Любой доступ (режим FCB-совместимости)
16 10h Запрещен любой доступ (Deny All)
32 20h Запрещена запись (Deny Write)
48 30h Запрещено чтение (Deny Read)
64 40h ??? (Deny None)

Возвращаемые ошибки:


   02 Файл не найден

   04 Слишком много открытых файлов

   05 Доступ запрещен

   52 Файл уже открыт

   75 Неверный описатель типа поля

Пример:


   ReadOnly     EQUATE(0)     !Мнемонические значения для режимов

   WriteOnly    EQUATE(1)     !  доступа

   ReadWrite    EOUATE(2)

   DenyAll      EQUATE(10h)

   DenyWrite    EQUATE(20h)

   DenyRead     EQUATE(30h)

   DenyNone     EQUATE(40h)

          CODE

          OPEN(Names,ReadWrite+DenyNone)  !Открываем полностью в

   				       !  режиме разделения.

См. также: SHARE

PACK (физически стереть удаленные записи)



     PACK(файл)

файл Метка файла.

Оператор PACK убирает удаленные записи из файла данных и перестраивает его ключи. Полученный файл будет компактен, насколько это возможно. PACK требует, как минимум, вдвое больше места на диске, чем занимает файл с ключами и МЕМО-файлами. Новые файлы создаются из старых, а старые файлы стираются ТОЛЬКО после успешного завершения процесса. PACK требует монопольного доступа к файлу.

Возвращаемые ошибки:


   63 Требуется монопольный доступ

Пример:


  OPEN(Trans,12h)               !Монопольно открывает файл и

  PACK(Trans)                   !  упаковывает его.

См. также: OPEN, SHARE

REMOVE (стереть файл данных)



     REMOVE(файл)

файл Метка файла, подлежащего удалению.

Оператор REMOVE стирает заданный файл из каталога аналогично команде ДОС Delete. Файл должен быть закрыт, иначе будет ошибка "Файл уже открыт". При возникновении какой-либо ошибки файл НЕ удаляется.

Возвращаемые ошибки:


   02 Файл не найден

   05 Доступ запрещен

   52 Файл уже открыт

Пример:


    REMOVE(OldFile)                       !Удаляем старый файл

    REMOVE(Changes)                       !Удаляем файл изменений

RENAME (переименовать файл данных)



     RENAME(файл,новый_файл)

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

Оператор RENAME либо меняет имя файла, либо переносит его в другой каталог на этом же диске. Файл, подлежащий переименованию, должен быть закрыт, иначе произойдет ошибка "Файл уже открыт". Если ФАЙЛ и НОВЫЙ_ФАЙЛ идентичны, то оператор RENAME игнорируется. При возникновении какой-либо ошибки, файл не переименовывается.

Поскольку некоторые файловые драйверы используют несколько физических ФАЙЛОВ для работы с ними как с ОДНИМ ФАЙЛОМ, то подразумеваемые имя и расширение файла зависят от файлового драйвера.

Возвращаемые ошибки:


    02 Файл не найден

    03 Путь не существует

    05 Доступ запрещен

    52 Файл уже открыт

Пример:


    RENAME(Text,'text.bak')          !Делаем резервную копию

    RENAME(Master,'\newdir')         !Перемещаем в другой каталог

SHARE (открыть файл данных)



     SHARE(файл[,режим доступа])

файл Метка файла.
режим доступа Числовая константа, переменная или выражение, задающее уровень доступа к файлу как для открывающего его пользователя, так и для остальных пользователей многопользовательской системы. Если пропущен, то подразумевается 42h (всем, кроме меня, DENY NONE).

Оператор SHARE открывает файл для обработки и устанавливает режим доступа к нему. Оператор SHARE аналогичен оператору OPEN и отличается от него только режимом доступа по умолчанию. РЕЖИМ ДОСТУПА это битовая карта, указывающая операционке, какой доступ предоставить открывающему пользователю, и какой доступ запретить для остальных потенциальных пользователей этого файла. Допустимы следующие значения режима доступа:

  Дес. 16н. Режим доступа
Открывающий пользователь 0 0h Только для чтения (Read Only)
1 1h Только для записи (Write Only)
2 2h Для чтения и записи (Read/Write)
Остальные пользователи 0 0h Любой доступ (режим FCB-совместимости)
16 10h Запрещен любой доступ (Deny All)
32 20h Запрещена запись (Deny Write)
48 30h Запрещено чтение (Deny Read)
64 40h ??? (Deny None)

Возвращаемые ошибки:


    02 Файл не найден

    04 Слишком много открытых файлов

    05 Доступ запрещен

    52 Файл уже открыт

    75 Неверный описатель типа поля

Пример:


   ReadOnly     EQUATE(0)     !Мнемонические значения для режимов

   WriteOnly    EQUATE(1)     !  доступа

   ReadWrite    EOUATE(2)

   DenyAll      EQUATE(10h)

   DenyWrite    EQUATE(20h)

   DenyRead     EQUATE(30h)

   DenyNone     EQUATE(40h)

          CODE

          SHARE(Names,ReadOnly+DenyWrite) !Открываем в режиме толь-

   				       !  ко для чтения.

См. также: OPEN

STREAM (разрешить буферизацию через ДОС)



     STREAM(файл)

файл Метка файла.

Некоторые файловые системы сбрасывают буфера при каждой записи на диск. Оператор STREAM запрещает это автоматический сброс. Буфера ДОС выделяются командой BUFFERS= в файле CONFIG.SYS. Они хранят записываемое на диск до тех пор, пока все буфера не заполнятся, а затем все сразу сбрасываются на диск. Элементы каталога обновляются только при физической записи буферов на диск. Операция STREAM завершается с закрытием файла, что автоматически сбрасывает буфера на диск, либо с выполнением оператора FLUSH.

Поддержка этого оператора зависит от файловой системы и описана в документации по файловому драйверу данной системы.

Пример:


    STREAM(History)                !Используем буфера ДОС

    SET(Current)                   !Идем в начало файла CURRENT

    LOOP UNTIL EOF(Current)

      NEXT(Current)

      His:Record - Cur:Record

      ADD(History)

    .  !End loop

    FLUSH(History)                 !Завершаем поточную обработку

				   ! и сбрасываем буфера на диск

См. также: FLUSH

UNLOCK (разблокировать заблокированный файл)



     UNLOCK(файл)

файл Метка файла.

Оператор UNLOCK разблокирует ранее заблокированный оператором LOCK файл данных. Он не может разблокировать файл, заблокированный другой станцией. Если файл не блокирован или блокирован другой станцией, то оператор UNLOCK игнорируется. UNLOCK не возвращает каких-либо ошибок. Точное действие UNLOCK зависит от файлового драйвера.

Пример:

   LOOP                      !Цикл во избежание "смертельного

   			     !  объятия"

     LOCK(Master,1)          !1 секунду пытаемся заблокировать

			     !  основной файл

     IF ERRORCODE() = 201    !Если кто-то уже блокирует его, то

       BEEP(0,100)           ! ждем секунду и

       CYCLE                 ! пытаемся снова...

     .

     LOCK(Detail,1)          !За секунду пытаемся заблокировать

			     !  файл подробностей



     IF ERRORCODE() = 201    !Если кто-то уже блокирует его, то

       UNLOCK(Master)        !  разблокируем занятый нами файл,

       BEEP(0,100)           !  подождем секунду и

       CYCLE                 !  еще разок попробуем

   . .                       !Конец операторов IF и LOOP

Назад | Содержание | Вперед

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...