Deno: обработка tar-архива приводит к ошибке контрольной суммы (стандартная библиотека)

Я хотел бы обработать tar-архив с помощью tar.tsиз стандартной библиотеки.

Архив можно успешно записать в test.tar по следующему коду:

import { Tar, Untar } from "https://deno.land/std/archive/tar.ts";

// create tar archive
const tar = new Tar();
const content = new TextEncoder().encode("hello tar world!");
await tar.append("output.txt", {
  reader: new Deno.Buffer(content),
  contentSize: content.byteLength,
});
await Deno.writeFile("./test.tar", tar.out);

Однако чтение tar вызывает ошибку:

error: Uncaught Error: checksum error  
      throw new Error("checksum error");  
        --------^
    at Untar.extract (https://deno.land/std/archive/tar.ts:432:13)  
    at async file:///C:/Users/bela/Desktop/script/test.ts:23:16  

Код:

// read from tar archive
const untar = new Untar(await Deno.open("./test.tar"));
const buf = new Deno.Buffer();
const result = await untar.extract(buf); // <-- this line triggers error
const untarText = new TextDecoder("utf-8").decode(buf.bytes());

Где я пропустил шаг?

1 ответ

Решение

Вы должны использовать tar.getReader() получить правильный tar содержание.

const tar = new Tar();
const content = new TextEncoder().encode("hello tar world!");
await tar.append("output.txt", {
    reader: new Deno.Buffer(content),
    contentSize: content.byteLength,
});

const writer = await Deno.open("./test.tar", { write: true, create: true });
await Deno.copy(tar.getReader(), writer);
const untar = new Untar(await Deno.open("./test.tar", { read: true }));
const buf = new Deno.Buffer();
const result = await untar.extract(buf); // <-- this line triggers error
const untarText = new TextDecoder("utf-8").decode(buf.bytes());
console.log(untarText);

tar.out в настоящее время заполнен нулями Uint8Array что кажется ошибкой в ​​стандартном коде

Другие вопросы по тегам