ФайловыйПоток.УстановитьРазмер

Методы · SetSize

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

Синтаксис

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

ФайловыйПоток.УстановитьРазмер (FileStream.SetSize)

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

УстановитьРазмер (SetSize)

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

Синтаксис:
УстановитьРазмер(<Размер>)
Параметры:

<Размер> (обязательный)
Тип: Число.
Устанавливаемый размер потока.
Описание:

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

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

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

Примечание:
Установить длину потока можно только в том случае, если в потоке разрешены запись и изменение позиции. В противном случае будет сгенерировано исключение.
См. также:
Поток, метод НачатьУстановкуРазмера
Поток, метод Размер
Поток, метод УстановитьРазмерАсинх

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

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

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

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

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

Сократить свой файл до ABC и заменить продолжение на XY

УстановитьРазмер меняет длину собственного файла, не размер исходного буфера. После расширения сами заполняем два новых байта, не предполагая их содержимое.

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

Серверная процедура отдельной учебной базы; локальный временный файл сервера.

Подготовка

  1. Каждый фрагмент запускайте отдельно в серверной процедуре своей учебной базы. Файл создаётся во временном каталоге сервера, не на компьютере клиента.

  2. Пример получает новое временное имя и использует СоздатьНовый, не Создать. Чужой существующий файл никогда не открывается для перезаписи.

  3. После завершения/ошибки закрываются только созданные потоки и удаляется только точное собственное имя. Это не резервная копия и не операция над вашими XML.

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

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

  1. Сокращение до 3 необратимо удаляет 123 именно из созданного уроком файла.

  2. Расширение до 5 не рассматриваем как способ получить заданный текст: явно пишем XY от позиции 3.

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

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

  1. Шесть сравнений Истина: размеры 3/5, чтение 5, ABCXY, исходный буфер 6/ABC123.

  2. Весь пример относится только к собственному новому файлу. Его окончательный результат не сохраняется после урока.

  3. Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.

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

Разобрано изменение размера с точным заполнением добавленной области.

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

  1. Никогда не подставляйте путь рабочего файла в этот учебный код: сокращение уничтожает хвост без отката.

  2. Не считайте исходный буфер резервной копией большого файла: здесь он мал и создан самим уроком.

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

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

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

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

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