MoveTo: примеры (JAVASCRIPT)

Использование moveTo в JavaScript на практике
Раздел: Canvas, Рисование
moveTo(x: Number, y: Number): undefined

Основы функции moveTo

Функция moveTo() в JavaScript используется для перемещения текущего положения в контексте выполнения, чаще всего в файловых операциях Node.js. Эта функция доступна в модуле fs для работы с файловыми дескрипторами.

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

Аргументы функции:

  • offset (число) - количество байтов для смещения
  • whence (число или строка) - точка отсчета смещения. Может принимать значения: 0 (SEEK_SET - от начала файла), 1 (SEEK_CUR - от текущей позиции), 2 (SEEK_END - от конца файла)

Возвращаемое значение: функция возвращает новую позицию в файле, отсчитываемую от начала файла в байтах.

Базовые примеры использования

Пример с числовым указанием точки отсчета:

const fs = require('fs');

fs.open('file.txt', 'r', (err, fd) => {
  if (err) throw err;
  
  // Перемещение на 100 байт от начала файла
  fs.read(fd, Buffer.alloc(10), 0, 10, 100, (err, bytesRead, buffer) => {
    console.log('Прочитано:', buffer.toString());
  });
});
Прочитано: [содержимое с позиции 100]

Пример с использованием констант:

const fs = require('fs');
const fd = fs.openSync('data.bin', 'r+');

// Перемещение на 50 байт от текущей позиции
const newPos = fs.readSync(fd, Buffer.alloc(20), 0, 20, 50);
console.log('Новая позиция:', newPos);
Новая позиция: 70

Альтернативные функции JavaScript

fs.createReadStream с опцией start: позволяет читать файл с определенной позиции без явного перемещения. Подходит для потокового чтения больших файлов.

fs.read с позицией: функция чтения принимает параметр позиции напрямую, что может заменить отдельный вызов moveTo для однократного чтения.

Buffer.slice: для работы с уже загруженными в память данными вместо перемещения в файле можно использовать операции с буферами.

Аналоги в других языках

Python: метод seek() у файловых объектов:

with open('file.txt', 'r') as f:
    f.seek(100)  # Перемещение на 100 байт от начала
    data = f.read(10)
Смещение выполнено успешно

PHP: функция fseek():

$fp = fopen('file.txt', 'r');
fseek($fp, 100);
echo fread($fp, 10);
Данные с позиции 100

C: функция fseek() из stdio.h:

FILE *fp = fopen('file.txt', 'r');
fseek(fp, 100L, SEEK_SET);
char buffer[11];
fread(buffer, 1, 10, fp);
Позиция изменена

Типичные ошибки

Попытка перемещения за пределы файла:

const fs = require('fs');
const fd = fs.openSync('small.txt', 'r');
// Файл размером 50 байт
const pos = fs.readSync(fd, Buffer.alloc(10), 0, 10, 100);
RangeError [ERR_FS_FILE_TOO_LARGE]: Размер файла превышает допустимый

Использование закрытого дескриптора:

const fs = require('fs');
const fd = fs.openSync('file.txt', 'r');
fs.closeSync(fd);
// Попытка использования после закрытия
fs.readSync(fd, Buffer.alloc(10), 0, 10, 0);
Error: EBADF: bad file descriptor

Изменения в последних версиях

В Node.js версии 12 и выше были улучшены обработчики ошибок для операций с файловыми дескрипторами. Добавлена поддержка Promise-based API через fs.promises:

const fs = require('fs').promises;

async function readAtPosition() {
  const fd = await fs.open('file.txt', 'r');
  const buffer = Buffer.alloc(10);
  await fd.read(buffer, 0, 10, 100);
  await fd.close();
}

В Node.js 16+ добавлены дополнительные проверки валидности позиций для предотвращения переполнения.

Расширенные примеры

Чтение структурированных данных из бинарного файла:

Пример javascript
const fs = require('fs');

function readFileHeader(fd) {
  const buffer = Buffer.alloc(16);
  // Чтение заголовка с позиции 0
  fs.readSync(fd, buffer, 0, 16, 0);
  return {
    signature: buffer.toString('utf8', 0, 4),
    version: buffer.readUInt16LE(4),
    dataOffset: buffer.readUInt32LE(8)
  };
}

const fd = fs.openSync('data.bin', 'r');
const header = readFileHeader(fd);
// Переход к данным
fs.readSync(fd, Buffer.alloc(100), 0, 100, header.dataOffset);
Заголовок прочитан, переход к данным выполнен

Построчное чтение с пропуском заголовка:

Пример javascript
const fs = require('fs');
const readline = require('readline');

const fd = fs.openSync('log.txt', 'r');
// Пропуск первых 1024 байт (заголовок)
const stream = fs.createReadStream(null, {fd: fd, start: 1024});
const rl = readline.createInterface({input: stream});

rl.on('line', (line) => {
  console.log('Строка:', line);
});
Чтение строк начинается с позиции 1024

Многократное перемещение в цикле:

Пример javascript
const fs = require('fs');
const fd = fs.openSync('index.bin', 'r');
const indexEntries = [];
let position = 0;

// Чтение индексной таблицы
for (let i = 0; i < 10; i++) {
  const buffer = Buffer.alloc(8);
  fs.readSync(fd, buffer, 0, 8, position);
  const offset = buffer.readUInt32LE(0);
  const size = buffer.readUInt32LE(4);
  indexEntries.push({offset, size});
  position += 8;
}
Индексная таблица прочитана

JS moveTo function comments

En
MoveTo Moves the starting point of a new sub-path to the (x, y) coordinates