Руководство разработчика

Метод ТИП_ФАЙЛ.ПОПЫТКА_ОТКРЫТЬ

Метод ПОПЫТКА_ОТКРЫТЬ предназначен для открытия файлов в различных режимах. Метод в большой степени является оберткой над функцией Windows API CreateFile. Подробности доступны в онлайн документации Microsoft: Функция CreateFileA (fileapi.h).

ФУНКЦИЯ ТИП_ЛОГИКА: ПОПЫТКА_ОТКРЫТЬ(ТИП_СТРОКА: имя_файла,
                                                режим_доступа,
                                                режим_разделения,
                                                режим_создания,
                                                флаги_и_атрибуты,
                                                кодировка)

Параметры

имя_файла
Имя файла.
режим_доступа
Доступ на чтение и/или запись:
  • "R" - чтение;
  • "W" - запись;
  • "A" - режим добавления в конец (при записи).
В строку может входить несколько перечисленных букв.
режим_разделения
Разрешения для совместного доступа к файлу:
  • "E" или "" - экслюзивное открытие, другие не смогут открыть;
  • "R" - другие смогут открыть файл на чтение;
  • "W" - другие смогут открыть файл на запись;
  • "D" - другие смогут удалить файл.
В строку может входить несколько перечисленных букв.
режим_создания
Режимы создания и открытия в зависимости от существования файла:
  • "C" - создавать всегда;
  • "N" - создавать только несуществующий;
  • "A" - открывать всегда;
  • "E" - открывать только существующий;
  • "T" - обнулять размер только существующего.
В строке может указываться только одна из перечисленных букв.
флаги_и_атрибуты
Атрибуты создаваемого файла и другие опции:
  • "H" - создавать скрытый файл;
  • "R" - создавать файл с атрибутом "только чтение";
  • "D" - удалять файл при закрытии;
  • "W" - запись минует все промежуточные кэши и попадает сразу на диск, в Инфо-Бухгалтере запись буфера на диск происходит после вывода конца строки.
В строку может входить несколько перечисленных букв.
кодировка
Строковое обозначение кодировки текстового файла:
  • "DOS" или "OEM" - производится перекодировка из cp1251 в cp866;
  • "WIN" или "ANSI - перекодировка не выполняется;
  • "UTF-8" - производится перекодировка из cp1251 в utf-8, в начало нового файла записывается последовательность BOM.
  • "UTF-8.NoBOM" - производится перекодировка из cp1251 в utf-8, BOM не записывается.

Возвращаемое значение

Логическое значение. ДА - файл успешно открыт. НЕТ - файл не был открыт. Код ошибки, из-за которой открытие файла не произошло, можно узнать с помощью вызова АТРИБУТ("last_error"). Коды ошибок соответствуют ошибкам Win32:

Пример

Метод ПОПЫТКА_ОТКРЫТЬ может использоваться для реализации файловых блокировок. Для установки эксклюзивной блокировки файл открывается на запись "W" в режиме создания "A", т.е. создавать всегда. После успешного открытия на запись в файл можно записать информацию о захваченной блокировке. Второй раз открыть файл с такими же параметрами (блокировка2) не удасться до тех пор, пока он не будет закрыт (ошибка "32" ERROR_SHARING_VIOLATION). Режим совместного доступа устанавливается "R", т.е. мы разрешаем открывать файл на чтение. Это позволяет открыть файл на чтение и прочитать информацию о захватившем блокировку. Читателю режим совместного доступа устанавливается "RW", чтобы он мог открывать файл при удерживающем блокировку писателе и наличии других читателей. Писателю указывается флаг "W", чтобы запись информации о блокировки не "зависала" в кэше и была сразу доступна читателям.

СОЗДАТЬ(блокировка, ТИП_ФАЙЛ)
ЕСЛИ блокировка.ПОПЫТКА_ОТКРЫТЬ("test.lock", "W", "R", "A", "W", "ANSI") ТО
  блокировка.ЗАПИСАТЬ("Вася") // кто захватил блокировку
КОНЕЦ_ЕСЛИ

СОЗДАТЬ(читатель, ТИП_ФАЙЛ)
ЕСЛИ читатель.ПОПЫТКА_ОТКРЫТЬ("test.lock", "R", "RW", "E", "", "ANSI") ТО
  СООБЩЕНИЕ("Блокировку удерживает: " + читатель.СЧИТАТЬ) // Блокировку удерживает: Вася
КОНЕЦ_ЕСЛИ

СОЗДАТЬ(блокировка2, ТИП_ФАЙЛ)
ЕСЛИ блокировка2.ПОПЫТКА_ОТКРЫТЬ("test.lock", "W", "R", "A", "", "ANSI") ТО
  // сюда не попадем...
ИНАЧЕ
  СООБЩЕНИЕ(АТРИБУТ("last_error")) // 32
КОНЕЦ_ЕСЛИ

Для автоматического удаления файла блокировки, когда он не используется, можно воспользоваться флагом "D" - удалять при закрытии. В этом случае флаг должен указываться как для писателя (блокировщика), так и читателя. Также режим совместного доступа должен допускать удаление файла писателем и читателем (кто последний его закроет, тот и удалит). Ниже приведен пример с автоматическим удалением файла:

СОЗДАТЬ(блокировка, ТИП_ФАЙЛ)
ЕСЛИ блокировка.ПОПЫТКА_ОТКРЫТЬ("test.lock", "W", "RD", "A", "WD", "ANSI") ТО
  блокировка.ЗАПИСАТЬ("Босс") // кто захватил блокировку
КОНЕЦ_ЕСЛИ

СОЗДАТЬ(читатель, ТИП_ФАЙЛ)
ЕСЛИ читатель.ПОПЫТКА_ОТКРЫТЬ("test.lock", "R", "RWD", "E", "D", "ANSI") ТО
  СООБЩЕНИЕ("Блокировку удерживает: " + читатель.СЧИТАТЬ) // Блокировку удерживает: Босс
КОНЕЦ_ЕСЛИ

См. также: