Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Объединить бинарные файлы

#windows #nodejs #файлы #bash #bat


В файле join.txt по одному на строке заданы имена файлов, которые надо объединить
в порядке следования. Хочу это сделать в консоли.

Попытался сделать так (в командной строке, не в батнике):

for /f "tokens=*" %f in (join.txt) do type "%f" >>result.bin


но в одном из случаев где-то потерялся байт - суммарный размер не сходится на 1 байт
и при сравнении с правильным файлом видно, что пропущен байт с кодом 1A:



Как объединить файлы так, чтобы бинарные данные не пострадали?
    


Ответы

Ответ 1



Если используется Windows 10, в котором установлена линуксовая подсистема, то вместо командной строки можно использовать bash: while read f || [[ -n $f ]]; do cat "$f" >>result.bin done

Ответ 2



В общем, с командной строкой ничего не придумал и написал скрипт для node.js: var fs = require('fs'); var filename = "join.txt"; // process.argv[2]; var dest = "result.bin"; // filename.replace(/\[names\](\.\w+)\.txt$/, "[full]$1"); if (filename === dest) { console.error("Can't determine dest filename"); return; } var files = fs.readFileSync(filename, "utf8").split(/\r?\n/); var resStream = fs.createWriteStream(dest, { flags: "wx" }); function go(i) { if (i === files.length) return resStream.end(); var cur = fs.createReadStream(files[i]) cur.pipe(resStream, {end:false}); cur.on('end', () => go(i+1)); } go(0);

Ответ 3



Решается средствами batch. Нужно просто копировать всё в результирующий файл. Создаем пустой файл, затирая старый. Затем все, найденное что в файл-списке, помещаем в результат. @copy /y nul result.bin @for /f "tokens=*" %%f in (join.txt) do copy /b result.bin +"%%f" result.bin

Комментариев нет:

Отправить комментарий