我在这样的文件缓冲区中读过:
let imageBuffer
try {
imageBuffer = fs.readFileSync('/some/path/to/image.jpg')
} catch (e) {
console.log('error reading in file', e)
}
然后我尝试stat
缓冲区:
let imageStats = fs.statSync(imageBuffer)
我收到以下错误:
Error: Path must be a string without null bytes
但是,当我查看文档时,它说statSync
接受了Buffer
:
path: string | Buffer | URL
我仔细检查了缓冲区实际上是缓冲区:
console.log(imageBuffer instanceof Buffer) // returns true
还检查了尺寸:
console.log(imageBuffer.byteLength) // returns 5928109 which is the correct size
那么我在这里误会了什么?你能只stat
一个文件路径吗?错误使它听起来像这样。但是文档似乎也清楚地表明你也可以提供缓冲区。
Bug还是我误解了什么?
答案 0 :(得分:4)
我认为fs.statSync(path)
的文档含糊不清。我相信这是在说它需要路径。路径可以是<string> | <Buffer> | <URL>
,但它必须是路径。
所以不要给它一个整个文件的缓冲区,你给它一个缓冲区,如果转回一个字符串,就是文件的路径。
换句话说,
fs.statSync("C:/foo.txt");
fs.statSync(Buffer.from("C:/foo.txt"));
fs.statSync(new URL("/foo", "https://www.example.com");
如果你考虑一下,它也是有道理的。操作系统如何能够为您提供有关文件原始字节的文件系统信息?一旦它的字节,它就会丢失文件系统的上下文。如果您读入2个相同文件的内容,它们的缓冲区将是相同的,但任何一个stat
都会给您不同的结果。您想要stat
路径,而不是内容。
答案 1 :(得分:1)
并不是说Buffer必须是整个文件内容。
来自documentation您可以看到第一个参数是path
。
如果他们在手册中写道参数必须是body
,content
或类似的东西,那么你可能是正确的。
所以这样的代码会起作用。
const imageFile = '/some/path/to/image.jpg';
let imageStats, imageBuffer;
try {
imageStats = fs.statSync(imageFile);
imageBuffer = fs.readFileSync(imageFile);
} catch (e) {
console.log('error reading in file', e)
}
但我确信我们应该要求社区在文档中添加示例。
否则它是不明确的。