【问题标题】:fs.statSync with Buffer "Error: Path must be a string without null bytes"fs.statSync 与缓冲区“错误:路径必须是没有空字节的字符串”
【发布时间】:2018-04-21 05:08:09
【问题描述】:

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

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一个文件路径吗?错误使它听起来像这样。但是文档似乎清楚地表明您也可以提供缓冲区。

错误还是我误解了什么?

【问题讨论】:

  • fs.readFileSync('/some/path/to/image.jpg') 的结果即使是缓冲区也不是文件路径。除非该文件的内容是文件路径。您应该将'/some/path/to/image.jpg' 传递给fs.statSync
  • 您可以将文件路径作为字符串、缓冲区或 URL 提供给fs.statSync。但是 6MB JPEG 不是文件路径。

标签: javascript node.js fs stat


【解决方案1】:

我认为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 个相同文件的内容,它们的 Buffers 将是相同的,但其中的 stat 会给您不同的结果。你想stat 一个路径,而不是内容。

【讨论】:

  • 啊,好吧,现在更有意义了。完全没有考虑到一旦文件被读入内存,文件系统就不会知道它的任何细节。谢谢
【解决方案2】:

并不是说 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)
}

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

否则会产生歧义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-14
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2011-07-05
    相关资源
    最近更新 更多