ФайловыйПоток.ТекущаяПозиция

Методы · CurrentPosition

Возвращает текущую позицию в потоке.

Синтаксис

ТекущаяПозиция()
Полное описание, параметры и ограничения

ФайловыйПоток.ТекущаяПозиция (FileStream.CurrentPosition)

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

ТекущаяПозиция (CurrentPosition)

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

Синтаксис:
ТекущаяПозиция()
Возвращаемое значение:
Тип: Число.

Описание:

Возвращает текущую позицию в потоке.

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

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

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

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

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

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

Записать только CDE из буфера ABCDEFG

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

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

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

Подготовка

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

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

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

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

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

  1. ABCDEF… имеет байтовые позиции с нуля: A=0, B=1, C=2. Из позиции 2 берём ровно три байта CDE.

  2. После записи позиция файла 3; перед чтением возвращаемся в его начало.

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

  4. Повторное чтение в конце возвращает 0, это не исключение и не новое значение буфера.

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

  1. Семь сравнений Истина; фактические байты 67/68/69 — C/D/E.

  2. Исходный буфер по-прежнему ABCDEFG; файл содержит только три байта.

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

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

Разделены смещение буфера, позиция потока и фактический размер чтения.

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

  1. Не декодируйте весь пятибайтный буфер как будто прочитаны все пять байтов.

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

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

Скопировать три байта с текущей позиции в память

КопироватьВ начинается не с нуля, а с текущей позиции. Из ABC123 после перехода в 2 получаем C12.

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

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

Подготовка

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

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

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

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

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

  1. Два первых байта A/B пропускаем явным Перейти(2, Начало).

  2. Целевой ПотокВПамяти создаём пустым; у копирования явно ограничиваем количество тремя.

  3. Проверяем возвращённое количество и обе позиции/размеры до извлечения данных.

  4. ЗакрытьИПолучитьДвоичныеДанные закрывает копию, затем обнуляем переменную, чтобы не использовать закрытый поток.

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

  1. Пять сравнений Истина: скопировано 3, позиция источника 5, копия 3, C12, источник 6.

  2. Ни A/B, ни последний 3 в копию не вошли; исходный файл не сокращён.

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

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

Получена трёхбайтная копия диапазона, а не всего файла.

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

  1. Чтобы скопировать весь файл, сначала установите позицию в начало; не путайте количество и конечную позицию.

  2. Копирование изменяет позицию источника и приёмника; для повторного чтения нужен отдельный переход.

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

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

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

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

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