如何在 Deno 中写入文件?

Mar*_*nde 9 javascript deno

我试图使用写入文件 Deno.writeFile

await Deno.writeFile('./file.txt', 'some content')
Run Code Online (Sandbox Code Playgroud)

但得到以下神秘错误:

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)
Run Code Online (Sandbox Code Playgroud)

在 Deno 中写入文件的正确方法是什么?

Mar*_*nde 12

在 Deno 中有多种写入文件的方法,所有这些方法都需要--allow-writeflag 并且throw在发生错误时会出现,因此您应该正确处理错误。

使用 Deno.writeFile

这个 API 需要一个Uint8Array,而不是一个string,这是你得到那个错误的原因。它还需要一个可选WriteFileOptions对象

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

还有同步 API(它像在 Node.js 中一样阻止事件循环)。

Deno.writeFileSync('./image.png', imageBytes);
Run Code Online (Sandbox Code Playgroud)

写字符串

如果你想写入一个文本文件并有一个字符串,最简单的方法是使用Deno.writeTextFile或writeFileStrfrom std/fs。

await Deno.writeTextFile('./file.txt', 'some content');
// or if you want sync API
Deno.writeTextFileSync('./file.txt', 'some content');
Run Code Online (Sandbox Code Playgroud)
// 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');
Run Code Online (Sandbox Code Playgroud)

您也可以Deno.writeFile与TextEncoder.

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

低级 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!
Run Code Online (Sandbox Code Playgroud)

见OpenOptions 这里。如果你想追加你会这样做:

{ append: true }
Run Code Online (Sandbox Code Playgroud)

您还可以使用更低级别的 API,例如Deno.write或Writer.write