Возвращает текущую позицию в потоке.
Синтаксис
ТекущаяПозиция()Полное описание, параметры и ограничения
ФайловыйПоток.ТекущаяПозиция (FileStream.CurrentPosition)
ФайловыйПоток (FileStream)
ТекущаяПозиция (CurrentPosition)
Доступен, начиная с версии 8.3.9.
Синтаксис:
ТекущаяПозиция()
Возвращаемое значение:
Тип: Число.
Описание:
Возвращает текущую позицию в потоке.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
Использование в версии:
Доступен, начиная с версии 8.3.9.
Методическая информация
Практические примеры
Записать только CDE из буфера ABCDEFG
Смещение 2 относится к исходному буферу, не к файлу. Новому файлу пишем три байта, затем отдельно показываем неполное чтение пяти.
Где и как запускать
Серверная процедура отдельной учебной базы; локальный временный файл сервера.
Подготовка
Каждый фрагмент запускайте отдельно в серверной процедуре своей учебной базы. Файл создаётся во временном каталоге сервера, не на компьютере клиента.
Пример получает новое временное имя и использует СоздатьНовый, не Создать. Чужой существующий файл никогда не открывается для перезаписи.
После завершения/ошибки закрываются только созданные потоки и удаляется только точное собственное имя. Это не резервная копия и не операция над вашими XML.
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
УчебныйФайл = Новый Файл(ИмяФайла);
Если УчебныйФайл.Существует() Тогда
ВызватьИсключение "Временное имя уже занято: чужой файл не открываем";
КонецЕсли;
Поток = Неопределено;
Вид = Неопределено;
Копия = Неопределено;
СозданСвойФайл = Ложь;
Попытка
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
СозданСвойФайл = Истина;
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABCDEFG", КодировкаТекста.UTF8, Ложь);
Поток.Записать(Буфер, 2, 3);
Сообщить(Поток.Размер() = 3);
Сообщить(Поток.ТекущаяПозиция() = 3);
Поток.Перейти(0, ПозицияВПотоке.Начало);
Прочитанный = Новый БуферДвоичныхДанных(5);
Количество = Поток.Прочитать(Прочитанный, 0, 5);
Сообщить(Количество = 3);
Сообщить(Прочитанный.Получить(0) = 67);
Сообщить(Прочитанный.Получить(1) = 68);
Сообщить(Прочитанный.Получить(2) = 69);
Сообщить(Поток.Прочитать(Прочитанный, 0, 1) = 0);
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
Сообщить(Не УчебныйФайл.Существует());Разбор по шагам
ABCDEF… имеет байтовые позиции с нуля: A=0, B=1, C=2. Из позиции 2 берём ровно три байта CDE.
После записи позиция файла 3; перед чтением возвращаемся в его начало.
Прочитать возвращает фактическое число 3, а не запрошенные 5. Проверяем только три полученных байта.
Повторное чтение в конце возвращает 0, это не исключение и не новое значение буфера.
Как проверить результат
Семь сравнений Истина; фактические байты 67/68/69 — C/D/E.
Исходный буфер по-прежнему ABCDEFG; файл содержит только три байта.
Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.
Ожидаемый результат
Разделены смещение буфера, позиция потока и фактический размер чтения.
На что обратить внимание
Не декодируйте весь пятибайтный буфер как будто прочитаны все пять байтов.
Смещение/количество должны попадать в границы буфера; значения здесь полностью заданы уроком.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Скопировать три байта с текущей позиции в память
КопироватьВ начинается не с нуля, а с текущей позиции. Из ABC123 после перехода в 2 получаем C12.
Где и как запускать
Серверная процедура отдельной учебной базы; локальный временный файл сервера.
Подготовка
Каждый фрагмент запускайте отдельно в серверной процедуре своей учебной базы. Файл создаётся во временном каталоге сервера, не на компьютере клиента.
Пример получает новое временное имя и использует СоздатьНовый, не Создать. Чужой существующий файл никогда не открывается для перезаписи.
После завершения/ошибки закрываются только созданные потоки и удаляется только точное собственное имя. Это не резервная копия и не операция над вашими XML.
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
УчебныйФайл = Новый Файл(ИмяФайла);
Если УчебныйФайл.Существует() Тогда
ВызватьИсключение "Временное имя уже занято: чужой файл не открываем";
КонецЕсли;
Поток = Неопределено;
Вид = Неопределено;
Копия = Неопределено;
СозданСвойФайл = Ложь;
Попытка
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
СозданСвойФайл = Истина;
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Поток.Записать(Буфер, 0, Буфер.Размер);
Поток.Перейти(2, ПозицияВПотоке.Начало);
Копия = Новый ПотокВПамяти;
Скопировано = Поток.КопироватьВ(Копия, 3);
Сообщить(Скопировано = 3);
Сообщить(Поток.ТекущаяПозиция() = 5);
Сообщить(Копия.Размер() = 3);
ДанныеКопии = Копия.ЗакрытьИПолучитьДвоичныеДанные();
Копия = Неопределено;
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ДанныеКопии, КодировкаТекста.UTF8) = "C12");
Сообщить(Поток.Размер() = 6);
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
Сообщить(Не УчебныйФайл.Существует());Разбор по шагам
Два первых байта A/B пропускаем явным Перейти(2, Начало).
Целевой ПотокВПамяти создаём пустым; у копирования явно ограничиваем количество тремя.
Проверяем возвращённое количество и обе позиции/размеры до извлечения данных.
ЗакрытьИПолучитьДвоичныеДанные закрывает копию, затем обнуляем переменную, чтобы не использовать закрытый поток.
Как проверить результат
Пять сравнений Истина: скопировано 3, позиция источника 5, копия 3, C12, источник 6.
Ни A/B, ни последний 3 в копию не вошли; исходный файл не сокращён.
Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.
Ожидаемый результат
Получена трёхбайтная копия диапазона, а не всего файла.
На что обратить внимание
Чтобы скопировать весь файл, сначала установите позицию в начало; не путайте количество и конечную позицию.
Копирование изменяет позицию источника и приёмника; для повторного чтения нужен отдельный переход.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.