Метод ТИП_ФАЙЛ.ПОПЫТКА_ОТКРЫТЬ
Метод ПОПЫТКА_ОТКРЫТЬ предназначен для открытия файлов в различных режимах. Метод в большой степени является оберткой над функцией 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:
- "2" ERROR_FILE_NOT_FOUND - файл не найден;
- "5" ERROR_ACCESS_DENIED - доступ запрещен;
- "32" ERROR_SHARING_VIOLATION - файл недоступен для совместного доступа в заданном режиме;
- "80" ERROR_FILE_EXISTS - файл уже существует;
- "87" ERROR_INVALID_PARAMETER - задана недопустимая комбинация параметров;
- "183" ERROR_FILE_EXISTS - файл существует.
Пример
Метод ПОПЫТКА_ОТКРЫТЬ может использоваться для реализации файловых блокировок. Для установки эксклюзивной блокировки файл открывается на запись "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") ТО СООБЩЕНИЕ("Блокировку удерживает: " + читатель.СЧИТАТЬ) // Блокировку удерживает: Босс КОНЕЦ_ЕСЛИ