fs.statSync with Buffer"错误:路径必须是没有空字节的字符串"

时间:2018-04-20 20:54:08

标签: javascript node.js fs stat

我在这样的文件缓冲区中读过:

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还是我误解了什么?

2 个答案:

答案 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

如果他们在手册中写道参数必须是bodycontent或类似的东西,那么你可能是正确的。

所以这样的代码会起作用。

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)
}

但我确信我们应该要求社区在文档中添加示例。

否则它是不明确的。