MoveTo: примеры (JAVASCRIPT)
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+ добавлены дополнительные проверки валидности позиций для предотвращения переполнения.
Расширенные примеры
Чтение структурированных данных из бинарного файла:
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);Заголовок прочитан, переход к данным выполнен
Построчное чтение с пропуском заголовка:
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
Многократное перемещение в цикле:
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;
}Индексная таблица прочитана