NodeJS将二进制数据写入文件而不进行覆盖

时间:2018-03-08 12:58:34

标签: node.js

我目前正在尝试使用NodeJS编写二进制文件。

我现在遇到的问题是,我不知道如何在两个字节之间插入数据而不会覆盖以下字节。

实施例

给定: 04 42 55 43 48 04

我知道想在5543之间插入48

预期结果:04 42 55 43 55 48 04

实际结果:04 42 55 43 55 04

代码

我使用以下代码写入我的文件:

fs.write(fd, 0x55, 4, (err) => {
    if (err) throw err;
    fs.close(fd);
});

1 个答案:

答案 0 :(得分:1)

我无法找到任何解决方案,所以我自己写了

function insert_data(fd, data, position, cb) {
    // ensure data i Buffer
    if (!Buffer.isBuffer(data)) {
        data = Buffer.from(data);
    }
    // get file size
    fs.fstat(fd, (err, stat) => {
        if (err) {
            return cb(err);
        }
        // calculate size for following bytes in file and allocate
        const buffer_size = stat.size > position ? stat.size - position : 0;
        const buffer = Buffer.alloc(buffer_size);
        // read bytes to by written after inserted data
        fs.read(fd, buffer, 0, buffer_size, position, (err, bytesRead, buffer) => {
            if (err) {
                return cb(err);
            }
            // concatenate new buffer containing data to be inserted and remaining bytes 
            const new_buffer = Buffer.concat([
                data,
                buffer
            ], data.length + buffer_size);
            // write new buffer starting from given position
            fs.write(fd, new_buffer, 0, new_buffer.length, position, (err) => {
                if (err) {
                    return cb(err);
                }
                fs.close(fd, cb);
            });
        });
    });
}

fs.open("test.bin", "r+", (err, fd) => {
    insert_data(fd, [0x55], 4, console.dir);
});