ФайловыйПоток.НачатьПолучениеРазмера

Методы · BeginGetSize

Возвращает размер данных в байтах. Если свойство ДоступноИзменениеПозиции установлено в значение Ложь, то при вызове данного метода будет сгенерировано исключение.

Синтаксис

НачатьПолучениеРазмера(<ОписаниеОповещения>)
Полное описание, параметры и ограничения

ФайловыйПоток.НачатьПолучениеРазмера (FileStream.BeginGetSize)

ФайловыйПоток (FileStream)

НачатьПолучениеРазмера (BeginGetSize)

Доступен, начиная с версии 8.3.9.

Синтаксис:
НачатьПолучениеРазмера(<ОписаниеОповещения>)
Параметры:

<ОписаниеОповещения> (необязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения работы метода со следующими параметрами:
<Результат> - тип Число. Размер данных в байтах.

<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.

Описание:

Возвращает размер данных в байтах.
Если свойство ДоступноИзменениеПозиции установлено в значение Ложь, то при вызове данного метода будет сгенерировано исключение.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.

См. также:
Поток, метод РазмерАсинх
Поток, метод Размер

Использование в версии:

Доступен, начиная с версии 8.3.9.

Описание изменено в версии 8.3.18.

Методическая информация

Практические примеры

Соединить восемь файловых операций через оповещения

Полный модуль формы пишет собственный ABC123 и проходит цепочку запись → сброс → размер → переход → чтение → копирование → сокращение → закрытие. Новый запуск заблокирован до завершения.

Где и как запускать

Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.

Подготовка

  1. Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.

  2. В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.

  3. Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.

  4. Файл создаётся на компьютере клиента Windows во временном каталоге. Веб-клиент и сервер для данного модуля не используйте.

  5. Требуется разрешённый в учебной базе доступ к локальной файловой системе. Не отключайте профиль безопасности рабочей базы ради запуска.

  6. Создаётся только собственный временный файл с режимом СоздатьНовый. После ожидания операций ресурсы закрываются, точное собственное имя удаляется.

  7. Это вариант без Асинх/Ждать. Вставьте весь модуль: все вызываемые оповещением процедуры должны иметь Экспорт.

  8. Сохранение буфера, приёмника и имени в Состояние необходимо до завершения оповещений. Не удаляйте файл сразу после НачатьЗапись.

Перем Выполняется;

&НаКлиенте
Процедура УчебныйПример(Команда)
    Если Выполняется = Истина Тогда
        Сообщить("Дождитесь окончания предыдущего примера");
        Возврат;
    КонецЕсли;
    Состояние = Новый Структура("Поток,Копия,Буфер,Прочитанный,ИмяФайла,СвойФайл",
        Неопределено, Неопределено, Неопределено, Неопределено, "", Ложь);
    Попытка
        Состояние.ИмяФайла = ПолучитьИмяВременногоФайла("bin");
        Файл = Новый Файл(Состояние.ИмяФайла);
        Если Файл.Существует() Тогда
            ВызватьИсключение "Имя уже занято: существующий файл не открываем";
        КонецЕсли;
        Состояние.Поток = Новый ФайловыйПоток(Состояние.ИмяФайла,
            РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
        Состояние.СвойФайл = Истина;
        Состояние.Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
        Состояние.Прочитанный = Новый БуферДвоичныхДанных(6);
    Исключение
        ОсвободитьРесурсы(Состояние);
        ВызватьИсключение;
    КонецПопытки;
    Выполняется = Истина;
    Попытка
        Состояние.Поток.НачатьЗапись(ОповещениеДля("ПослеЗаписи", Состояние), Состояние.Буфер, 0, 6);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция ОповещениеДля(Имя, Состояние)
    Возврат Новый ОписаниеОповещения(Имя, ЭтотОбъект, Состояние,
        "ОшибкаОперации", ЭтотОбъект);
КонецФункции

&НаКлиенте
Процедура ОсвободитьРесурсы(Состояние)
    Если Состояние.Копия <> Неопределено Тогда
        Попытка
            Состояние.Копия.Закрыть();
            Состояние.Копия = Неопределено;
        Исключение
            Сообщить("Не удалось закрыть собственную копию: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    Если Состояние.Поток <> Неопределено Тогда
        Попытка
            Состояние.Поток.Закрыть();
            Состояние.Поток = Неопределено;
        Исключение
            Сообщить("Не удалось закрыть собственный источник: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    Если Состояние.СвойФайл Тогда
        Если Состояние.Поток = Неопределено Тогда
            Попытка
                Файл = Новый Файл(Состояние.ИмяФайла);
                Если Файл.Существует() Тогда
                    УдалитьФайлы(Состояние.ИмяФайла);
                КонецЕсли;
                Сообщить(Не Файл.Существует());
                Состояние.СвойФайл = Ложь;
            Исключение
                Сообщить("Свой временный файл остался: " + Состояние.ИмяФайла);
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
        Иначе
            Сообщить("Источник не закрыт; собственный файл не удаляем: " + Состояние.ИмяФайла);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
    ОсвободитьРесурсы(Состояние);
    Выполняется = Ложь;
    СтандартнаяОбработка = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(Состояние) Экспорт
    Попытка
        Состояние.Поток.НачатьСбросБуферов(ОповещениеДля("ПослеСброса", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеСброса(Состояние) Экспорт
    Попытка
        Состояние.Поток.НачатьПолучениеРазмера(ОповещениеДля("РазмерДоЧтения", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура РазмерДоЧтения(Размер, Состояние) Экспорт
    Попытка
        Сообщить(Размер = 6);
        Состояние.Поток.НачатьПереход(ОповещениеДля("ПозицияДоЧтения", Состояние), 0, ПозицияВПотоке.Начало);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПозицияДоЧтения(Позиция, Состояние) Экспорт
    Попытка
        Сообщить(Позиция = 0);
        Состояние.Поток.НачатьЧтение(ОповещениеДля("ПослеЧтения", Состояние), Состояние.Прочитанный, 0, 6);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЧтения(Количество, Состояние) Экспорт
    Попытка
        Если Количество <> 6 Тогда
            ВызватьИсключение "Не получены шесть собственных учебных байтов";
        КонецЕсли;
        Сообщить(Количество = 6);
        Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Состояние.Прочитанный, КодировкаТекста.UTF8) = "ABC123");
        Состояние.Поток.НачатьПереход(ОповещениеДля("ПозицияДоКопии", Состояние), 2, ПозицияВПотоке.Начало);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПозицияДоКопии(Позиция, Состояние) Экспорт
    Попытка
        Сообщить(Позиция = 2);
        Состояние.Копия = Новый ПотокВПамяти;
        Состояние.Поток.НачатьКопированиеВ(ОповещениеДля("ПослеКопии", Состояние), Состояние.Копия, 3);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеКопии(Количество, Состояние) Экспорт
    Попытка
        Сообщить(Количество = 3);
        ДанныеКопии = Состояние.Копия.ЗакрытьИПолучитьДвоичныеДанные();
        Состояние.Копия = Неопределено;
        Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ДанныеКопии, КодировкаТекста.UTF8) = "C12");
        Состояние.Поток.НачатьУстановкуРазмера(ОповещениеДля("ПослеРазмера", Состояние), 3);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеРазмера(Состояние) Экспорт
    Попытка
        Состояние.Поток.НачатьПолучениеРазмера(ОповещениеДля("РазмерПослеСокращения", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура РазмерПослеСокращения(Размер, Состояние) Экспорт
    Попытка
        Сообщить(Размер = 3);
        Состояние.Поток.НачатьЗакрытие(ОповещениеДля("ПослеЗакрытия", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытия(Состояние) Экспорт
    Попытка
        Состояние.Поток = Неопределено;
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        Сообщить("Цепочка файловых операций завершена");
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Разбор по шагам

  1. УчебныйПример создаёт Структура состояния, новый защищённый от перезаписи файл и сохраняет оба буфера.

  2. Следующая операция запускается только в обработчике завершения предыдущей. Начать… не возвращает конечные числа немедленно.

  3. ПослеЗаписи/ПослеСброса получают только Состояние; размер/позиция/количество передаются первым аргументом своих обработчиков.

  4. Чтение проверяет фактические 6 до декодирования. С позиции 2 копируются только 3 байта C12.

  5. Установка размера до 3 проверяется новым асинхронным получением размера.

  6. ПослеЗакрытия очищает собственный файл. Ошибка операции и немедленная ошибка запуска освобождают ресурсы отдельным путём.

  7. Если закрытие или удаление не удалось, выводится конкретный собственный путь, успех очистки не выдумывается.

Как проверить результат

  1. Восемь сравнений по цепочке Истина: 6, 0, чтение 6/ABC123, переход 2, копирование 3/C12, итог 3.

  2. При успешной очистке ещё Истина (файл отсутствует) и сообщение завершения; повторное раннее нажатие даёт предупреждение, второй файл не создаётся.

Ожидаемый результат

Отработана последовательная клиентская цепочка оповещений с жизненным циклом собственных ресурсов.

На что обратить внимание

  1. УчебныйПример закончит выполнение раньше цепочки: его возврат не означает, что запись завершена.

  2. Обычная ошибка асинхронной операции не обязательно попадает в первоначальную Попытка — нужен обработчик ошибки в ОписаниеОповещения.

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

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.