我如何在 Deno 中写入文件?
How can I write files in Deno?
我正在尝试使用 Deno.writeFile
写入文件
await Deno.writeFile('./file.txt', 'some content')
但出现以下神秘错误:
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 中写入文件的正确方法是什么?
在 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(它像 Node.js 中那样阻塞事件循环)。
Deno.writeFileSync('./image.png', imageBytes);
写入字符串
如果你想写入一个文本文件并有一个字符串,最简单的方法是使用 std/fs
.
中的 Deno.writeTextFile
or writeFileStr
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'));
低级APIs
使用 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
here。如果你想附加你会做:
{ append: true }
你还可以使用更低级别的 API,例如 Deno.write
or Writer.write
您可以对可能不存在的目录使用ensureDir
to safely write files:
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 */)
这个变体稍微不那么冗长,需要一个额外的写操作(如果不存在则创建文件)。
我正在尝试使用 Deno.writeFile
await Deno.writeFile('./file.txt', 'some content')
但出现以下神秘错误:
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 中写入文件的正确方法是什么?
在 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(它像 Node.js 中那样阻塞事件循环)。
Deno.writeFileSync('./image.png', imageBytes);
写入字符串
如果你想写入一个文本文件并有一个字符串,最简单的方法是使用 std/fs
.
Deno.writeTextFile
or writeFileStr
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'));
低级APIs
使用 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
here。如果你想附加你会做:
{ append: true }
你还可以使用更低级别的 API,例如 Deno.write
or Writer.write
您可以对可能不存在的目录使用ensureDir
to safely write files:
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 */)
这个变体稍微不那么冗长,需要一个额外的写操作(如果不存在则创建文件)。