我试图使用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);
写字符串
如果要写入文本文件并具有字符串,最简单的方法是使用
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
here。如果要追加,则可以执行以下操作:{ append: true }
您还可以使用更低级的API,例如
Deno.write
或 Writer.write