Создает или перезаписывает файл и открывает поток с возможностью чтения и записи в файл. Файл открывается в режиме разделяемого чтения.
Синтаксис
Создать(<ИмяФайла>, <РазмерБуфера>)Полное описание, параметры и ограничения
МенеджерФайловыхПотоков.Создать (FileStreamsManager.Create)
МенеджерФайловыхПотоков (FileStreamsManager)
Создать (Create)
Доступен, начиная с версии 8.3.9.
Синтаксис:
Создать(<ИмяФайла>, <РазмерБуфера>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя создаваемого файла.
<РазмерБуфера> (необязательный)
Тип: Число.
Размер буфера.
Возвращаемое значение:
Тип: ФайловыйПоток.
Описание:
Создает или перезаписывает файл и открывает поток с возможностью чтения и записи в файл. Файл открывается в режиме разделяемого чтения.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
См. также:
МенеджерФайловыхПотоков, метод НачатьСоздание
МенеджерФайловыхПотоков, метод СоздатьАсинх
Использование в версии:
Доступен, начиная с версии 8.3.9.
Описание изменено в версии 8.3.18.
Методическая информация
Практические примеры
Получить ZBCZ: перезапись начала, дописывание и два варианта Открыть
Полный клиентский опыт на одном собственном трёхбайтном файле с проверкой содержимого и очисткой.
Где и как запускать
Полный модуль собственной управляемой формы, локальный клиент Windows.
Подготовка
Собственная учебная база 8.5.1.1343, тонкий или толстый клиент Windows с разрешённой локальной файловой системой. Создайте внешнюю обработку с управляемой формой, командой Выполнить и кнопкой; вставьте весь модуль одного урока.
Это клиентский модуль, не серверный и не веб-клиентский: используются локальные файлы и операции потока, доступные этому окружению. Не отключайте профиль безопасности рабочей базы ради урока.
Именованные уроки получают новое временное имя, резервируют его через СоздатьНовый и только после этого показывают методы, способные перезаписать собственный файл. Ни один путь не вводится пользователем.
Автоматический временный поток создаётся менеджером без заданного имени. Не обещаем физический файл, его расположение или отсутствие файла на диске по одному свойству потока.
Не закрывайте форму в середине асинхронной цепочки. После нормального завершения проверяйте сообщения очистки; при аварийном завершении клиента платформа может оставить временный файл до штатной уборки.
&НаКлиенте
Процедура Выполнить(Команда)
Состояние = Новый Структура("Имя,Поток,СозданСвойФайл", ПолучитьИмяВременногоФайла("bin"), Неопределено, Ложь);
ПроверкаИмени = Новый Файл(Состояние.Имя);
Если ПроверкаИмени.Существует() Тогда
ВызватьИсключение "Временное имя занято: чужой файл не открываем и не удаляем";
КонецЕсли;
ОшибкаОперации = "";
Попытка
Состояние.Поток = Новый ФайловыйПоток(Состояние.Имя, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
Состояние.СозданСвойФайл = Истина;
Состояние.Поток.Закрыть();
Состояние.Поток = Неопределено;
Состояние.Поток = ФайловыеПотоки.Создать(Состояние.Имя, 8192);
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC", КодировкаТекста.UTF8, Ложь);
Состояние.Поток.Записать(Буфер, 0, 3);
Состояние.Поток.Закрыть();
Состояние.Поток = ФайловыеПотоки.ОткрытьДляЗаписи(Состояние.Имя, 8192);
Замена = ПолучитьБуферДвоичныхДанныхИзСтроки("Z", КодировкаТекста.UTF8, Ложь);
Состояние.Поток.Записать(Замена, 0, 1);
Состояние.Поток.Закрыть();
Состояние.Поток = ФайловыеПотоки.ОткрытьДляЧтения(Состояние.Имя);
Сообщить(Состояние.Поток.ДоступноЧтение И НЕ Состояние.Поток.ДоступнаЗапись);
Прочитанный = Новый БуферДвоичныхДанных(3);
Сообщить(Состояние.Поток.Прочитать(Прочитанный, 0, 3) = 3);
Сообщить(Прочитанный.Получить(0) = 90 И Прочитанный.Получить(1) = 66 И Прочитанный.Получить(2) = 67);
Состояние.Поток.Закрыть();
Состояние.Поток = ФайловыеПотоки.ОткрытьДляДописывания(Состояние.Имя);
Состояние.Поток.Записать(Замена, 0, 1);
Состояние.Поток.Закрыть();
Состояние.Поток = ФайловыеПотоки.Открыть(РежимОткрытияФайла.Открыть, Состояние.Имя, 8192);
Сообщить(Состояние.Поток.Размер() = 4);
Сообщить(Состояние.Поток.ДоступноЧтение И Состояние.Поток.ДоступнаЗапись);
Состояние.Поток.Закрыть();
Состояние.Поток = ФайловыеПотоки.Открыть(ДоступКФайлу.Чтение, Состояние.Имя, РежимОткрытияФайла.Открыть, 8192);
ЧетыреБайта = Новый БуферДвоичныхДанных(4);
Сообщить(Состояние.Поток.Прочитать(ЧетыреБайта, 0, 4) = 4);
Сообщить(ЧетыреБайта.Получить(3) = 90);
Сообщить(НЕ Состояние.Поток.ДоступнаЗапись);
Исключение
ОшибкаОперации = ОписаниеОшибки();
КонецПопытки;
ОшибкаОчистки = ОчиститьФайлУрока(Состояние);
Если Не ПустаяСтрока(ОшибкаОперации) Или Не ПустаяСтрока(ОшибкаОчистки) Тогда
ВызватьИсключение ОшибкаОперации + " " + ОшибкаОчистки;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ОчиститьФайлУрока(Состояние)
ОшибкаЗакрытия = ЗакрытьПотокУрока(Состояние.Поток);
Если Не ПустаяСтрока(ОшибкаЗакрытия) Тогда
Возврат ОшибкаЗакрытия;
КонецЕсли;
Состояние.Поток = Неопределено;
Если Состояние.СозданСвойФайл Тогда
Попытка
СвойФайл = Новый Файл(Состояние.Имя);
Если СвойФайл.Существует() Тогда
УдалитьФайлы(Состояние.Имя);
КонецЕсли;
Если СвойФайл.Существует() Тогда
Возврат "Собственный временный файл остался после очистки";
КонецЕсли;
Сообщить("Точный собственный временный файл удалён");
Исключение
Возврат "Не удалось удалить собственный временный файл: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Возврат "";
КонецФункции
&НаКлиенте
Функция ЗакрытьПотокУрока(Поток)
Если Поток = Неопределено Тогда
Возврат "";
КонецЕсли;
Попытка
Поток.Закрыть();
Возврат "";
Исключение
Возврат "Не удалось закрыть собственный поток: " + ОписаниеОшибки();
КонецПопытки;
КонецФункцииРазбор по шагам
ПолучитьИмяВременногоФайла само не создаёт файл. Проверяем занятость и резервируем собственное имя через конструктор СоздатьНовый; чужое имя при конфликте не удаляется.
Создать перезаписывает только уже созданный нами пустой файл. Записываем ASCII ABC без BOM — три байта 65, 66, 67.
ОткрытьДляЗаписи пишет поверх начала: один байт Z=90 заменяет A. Ожидается ZBC, а не только Z; хвост не удаляется автоматически.
ОткрытьДляЧтения возвращает поток без возможности записи. ОткрытьДляДописывания добавляет Z в конец: получается ZBCZ, четыре байта.
Перед каждым повторным открытием предыдущий поток закрыт. Только собственный файл удаляется после успешного закрытия; ошибки операции и уборки сообщаются вместе.
У синхронного Открыть первый вариант принимает РежимОткрытия, ИмяФайла, РазмерБуфера; второй — ДоступКФайлу, ИмяФайла, РежимОткрытия, РазмерБуфера. Порядок не такой, как у ОткрытьАсинх.
Как проверить результат
Восемь сравнений ожидаются Истина; данные последовательно ABC → ZBC → ZBCZ.
Последнее сообщение подтверждает удаление точного собственного временного файла. Нет такого сообщения при неудачной очистке.
Не подставляйте пути ваших XML, HTML или рабочей базы вместо автоматически полученного имени.
Ожидаемый результат
На собственном файле показано назначение пяти методов менеджера, включая обе перегрузки Открыть.
На что обратить внимание
Создать может уничтожить прежнее содержимое. Он допустим здесь только после резервирования собственного имени.
ОткрытьДляЗаписи не является гарантией усечения хвоста файла до размера новой записи.
Не удалять файл при ошибке закрытия: пример сообщает проблему и оставляет точное имя для штатной уборки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.