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