Как я могу записывать файлы в Deno? - PullRequest
6 голосов
/ 26 мая 2020

Я пытался записать в файл, используя Deno.writeFile

await Deno.writeFile('./file.txt', 'some content')

Но получил следующую ошибку crypti c:

error: Uncaught TypeError: arr.subarray is not a function
    at Object.writeAll ($deno$/buffer.ts:212:35)
    at Object.writeFile ($deno$/write_file.ts:70:9)

Как правильно записывать файлы в Deno?

Ответы [ 2 ]

7 голосов
/ 26 мая 2020

Есть несколько способов записать файл в Deno, все они требуют флага --allow-write и будут throw в случае возникновения ошибки, поэтому вы должны правильно обрабатывать ошибки.

Использование Deno.writeFile

Этот API принимает Uint8Array, а не строку , причину, по которой вы получаете эту ошибку. Также требуется необязательный объект WriteFileOptions

const res = await fetch('http://example.com/image.png');
const imageBytes = new Uint8Array(await res.arrayBuffer());
await Deno.writeFile('./image.png', imageBytes);

. Также существует синхронный API (он блокирует событие l oop, как это происходит в Node.js).

Deno.writeFileSync('./image.png', imageBytes);

Запись строк

Если вы хотите записать в текстовый файл и получить строку, проще всего использовать Deno.writeTextFile или writeFileStr из std/fs.

await Deno.writeTextFile('./file.txt', 'some content');
// or if you want sync API
Deno.writeTextFileSync('./file.txt', 'some content');
// import { writeFileStr, writeFileStrSync } from 'https://deno.land/std/fs/mod.ts'
import { writeFileStr, writeFileStrSync } from 'https://deno.land/std/fs/write_file_str.ts'

await writeFileStr('./file.txt', 'some content');
writeFileStrSync('./file.txt', 'some content');

Вы также можете использовать Deno.writeFile с TextEncoder.

const encoder = new TextEncoder(); // to convert a string to Uint8Array
await Deno.writeFile('./file.txt', encoder.encode('some content'));

API низкого уровня

Использование Deno.open и Deno.writeAll (или Deno.writeAllSync)

const file = await Deno.open('./image.png', { write: true, create: true });
/* ... */
await Deno.writeAll(file, imageBytes);
file.close(); // You need to close it!

См. OpenOptions здесь . Если вы хотите добавить, вы должны сделать:

{ append: true }

И вы также можете использовать API даже более низкого уровня, такие как Deno.write или Writer.write

1 голос
/ 02 июня 2020

Вы можете использовать ensureDir для безопасной записи файлов в возможно несуществующие каталоги:

import { ensureDir } from "https://deno.land/std@0.54.0/fs/ensure_dir.ts";

ensureDir("./my/dir")
  .then(() => Deno.writeTextFile("./my/dir/file.txt", "some content"));

Каталог, содержащий файлы, может быть получен с помощью dirname:

import { dirname } from "https://deno.land/std@0.54.0/path/mod.ts";

const file = "./my/dir/file.txt";
ensureDir(dirname(file)).then(() => Deno.writeTextFile(file, "some content"));

Альтернативой является ensureFile для подтверждения существования файла:

import { ensureFile } from "https:deno.land/std/fs/ensure_file.ts";

ensureFile(file).then(/* your file write method */)

Этот вариант немного менее подробен , со стоимостью одной дополнительной операции записи (создание файла, если он не существует).

...