fs.statSync with Buffer "Error: Path must be a string without null bytes"

fs.statSync with Buffer "Error: Path must be a string without null bytes"

我读入了这样的文件缓冲区:

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

而且我仔细检查了 Buffer 实际上是一个 Buffer:

console.log(imageBuffer instanceof Buffer) // returns true

还检查了尺码:

console.log(imageBuffer.byteLength) // returns 5928109 which is the correct size

那么我在这里误解了什么?可以只 stat 一个文件路径吗?错误使它听起来像这样。但是文档似乎清楚地表明您也可以提供 Buffer。

错误还是我误解了什么?

我认为 fs.statSync(path) 的文档含糊不清。我相信它是在说它想要 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 路径,而不是内容。

并没有说缓冲区必须是整个文件内容。

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

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

否则有歧义