Тип: Булево. Признак доступности произвольного изменения позиции чтения/записи в потоке.
Полное описание, параметры и ограничения
Поток.ДоступноИзменениеПозиции (Stream.CanSeek)
Поток (Stream)
ДоступноИзменениеПозиции (CanSeek)
Доступен, начиная с версии 8.3.9.
Использование:
Только чтение.
Описание:
Тип: Булево.
Признак доступности произвольного изменения позиции чтения/записи в потоке.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
Использование в версии:
Доступен, начиная с версии 8.3.9.
Методическая информация
Практические примеры
Получить поток только для чтения и увидеть общую позицию
Readonly-вид разделяет данные и позицию с файловым потоком. Это не независимая копия файла и не запрет изменения файла всеми процессами.
Где и как запускать
Серверная процедура отдельной учебной базы; локальный временный файл сервера.
Подготовка
Каждый фрагмент запускайте отдельно в серверной процедуре своей учебной базы. Файл создаётся во временном каталоге сервера, не на компьютере клиента.
Пример получает новое временное имя и использует СоздатьНовый, не Создать. Чужой существующий файл никогда не открывается для перезаписи.
После завершения/ошибки закрываются только созданные потоки и удаляется только точное собственное имя. Это не резервная копия и не операция над вашими XML.
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
УчебныйФайл = Новый Файл(ИмяФайла);
Если УчебныйФайл.Существует() Тогда
ВызватьИсключение "Временное имя уже занято: чужой файл не открываем";
КонецЕсли;
Поток = Неопределено;
Вид = Неопределено;
Копия = Неопределено;
СозданСвойФайл = Ложь;
Попытка
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
СозданСвойФайл = Истина;
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Поток.Записать(Буфер, 0, Буфер.Размер);
Поток.Перейти(0, ПозицияВПотоке.Начало);
Вид = Поток.ПолучитьПотокТолькоДляЧтения();
Сообщить(Вид.ДоступноЧтение);
Сообщить(Не Вид.ДоступнаЗапись);
Сообщить(Вид.ДоступноИзменениеПозиции);
Сообщить(Вид.Размер() = 6);
Сообщить(Вид.Перейти(2, ПозицияВПотоке.Начало) = 2);
Сообщить(Поток.ТекущаяПозиция() = 2);
Часть = Новый БуферДвоичныхДанных(2);
Сообщить(Вид.Прочитать(Часть, 0, 2) = 2);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Часть, КодировкаТекста.UTF8) = "C1");
Сообщить(Вид.ТекущаяПозиция() = 4);
Сообщить(Поток.ТекущаяПозиция() = 4);
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
Сообщить(Не УчебныйФайл.Существует());Разбор по шагам
Заполняем собственный файл и возвращаемся в начало до получения readonly-вида.
Читаем реальные возможности Вид, полученного как Поток. ДоступнаЗапись ложна, но изменение позиции допускается.
Переход в виде меняет общую позицию источника; чтение C1 передвигает оба до 4.
Все операции выполняем до закрытия любого из связанных потоков; после этого оба больше не используем.
Как проверить результат
Десять сравнений Истина: возможности, размеры, обе общие позиции и C1.
Данные не копировались во второй файл. Чтение вида не изменяло содержимое ABC123.
Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.
Ожидаемый результат
Показано разделение данных и позиции между потоком и readonly-видом.
На что обратить внимание
Если нужен независимый курсор, создайте отдельную копию/поток, а не ещё один readonly-вид.
Readonly относится к данному API доступа. Это не ACL, шифрование и не глобальная блокировка файла.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Открыть собственные двоичные данные как поток чтения
ОткрытьПотокДляЧтения возвращает Поток с позицией в начале данных. Размер шесть байтов не означает, что курсор автоматически возвращается в начало перед копированием.
Где и как запускать
Серверная процедура учебной базы; собственные двоичные данные в памяти, без файлов.
Подготовка
Используйте отдельную учебную базу. Фрагмент без директив вставьте в тело серверной процедуры ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.
Все исходные байты создаются самим примером в памяти. Файлы, сеть, справочники и документы не нужны.
Запускайте задачи отдельно. После закрытия ЧтениеДанных/ЗаписьДанных не используйте этот экземпляр повторно.
Данные = ПолучитьДвоичныеДанныеИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Поток = Данные.ОткрытьПотокДляЧтения();
Вид = Неопределено;
Копия = Неопределено;
Попытка
Сообщить(Поток.ДоступноЧтение);
Сообщить(Не Поток.ДоступнаЗапись);
Сообщить(Поток.ДоступноИзменениеПозиции);
Сообщить(Поток.ТекущаяПозиция() = 0);
Сообщить(Поток.Размер() = 6);
Первые = Новый БуферДвоичныхДанных(2);
Сообщить(Поток.Прочитать(Первые, 0, 2) = 2);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Первые, КодировкаТекста.UTF8) = "AB");
Копия = Новый ПотокВПамяти;
Сообщить(Поток.КопироватьВ(Копия) = 4);
Хвост = Копия.ЗакрытьИПолучитьДвоичныеДанные();
Копия = Неопределено;
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Хвост, КодировкаТекста.UTF8) = "C123");
Сообщить(Поток.ТекущаяПозиция() = 6);
Сообщить(Поток.Перейти(0, ПозицияВПотоке.Начало) = 0);
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Поток.Закрыть();
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Поток.Закрыть();Разбор по шагам
Кодирование ASCII без BOM создаёт неизменяемые шесть байтов в памяти.
Проверяем доступность чтения/изменения позиции и отсутствие доступа к записи.
Прочитать забирает AB, КопироватьВ без количества копирует только оставшийся C123.
После копирования курсор 6; возвращаем его в начало отдельным Перейти. Оба потока закрываются.
Как проверить результат
Одиннадцать сравнений Истина; прочитано 2, скопировано 4.
На диске не появился файл, исходные ДвоичныеДанные по-прежнему ABC123.
Ожидаемый результат
Разобран реальный базовый Поток, полученный из своих ДвоичныеДанные.
На что обратить внимание
КопироватьВ не возвращает ДвоичныеДанные: результат — количество скопированных байтов.
Для кириллицы два байта не обязательно равны двум символам. Здесь намеренно ASCII.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.