Node.js读取文件,如果存在追加数据,如果不存在则创建文件

问题描述 投票:0回答:3

我尝试使用fs.open()。但是当文件不存在时,数据就存在了。以下是我的代码:

fs.open('person.json', 'w', function (err, data) {
  if (err) throw err;
  console.log(data)
});

console.log(数据)结果是

3

这是为什么? 3来自哪里?

我的目的是读取文件(如果存在)并创建新文件(如果不存在)。如何在node.js中做到这一点?

node.js fs
3个回答
2
投票

'3' - 是文件描述符。 https://nodejs.org/api/fs.html#fs_file_descriptors

'w' - 打开文件写作。创建文件(如果它不存在)或截断(如果存在)。

使用'r +' - 打开文件进行读写。如果文件不存在,则会发生异常。

https://nodejs.org/api/fs.html#fs_file_system_flags


2
投票
  1. 听起来你要做的第一件事就是调用fs.statSync()来检查文件是否存在。
  2. 如果它存在,则调用fs.open("r")来读取它。
  3. 否则,听起来你想要创建它。 fs.open(“w”),就像你上面所做的那样,应该可以正常工作。
  4. fs.open返回文件描述符。我怀疑这可能是你要问的“3”。

附录4/24/19

从历史上讲(其他语言,其他时候),使用“例外”来处理“控制流”的想法坦率地说是非常恐怖。

repeatdomiau提出了一个有效的观点。文档似乎建议只是打开文件,并处理可能出现的任何异常:

https://nodejs.org/api/fs.html

// Check if the file exists in the current directory, and if it is writable.
fs.access(file, fs.constants.F_OK | fs.constants.W_OK, (err) => {
  if (err) {
    console.error(
      `${file} ${err.code === 'ENOENT' ? 'does not exist' : 'is read-only'}`);
  } else {
    console.log(`${file} exists, and it is writable`);
  }
});

在调用fs.open()之前,使用fs.access()检查文件的可访问性,不建议使用fs.readFile()或fs.writeFile()。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。相反,用户代码应该直接打开/读取/写入文件,并处理在文件无法访问时引发的错误。


0
投票

您可以使用“ax”模式表示打开以进行追加。如果该文件不存在,则会创建该文件,但该文件以独占模式打开。或者可以使用“a +”模式表示打开以进行阅读和追加。如果该文件不存在,则创建它并且您获得的'3'是文件描述符(“在POSIX系统上,对于每个进程,内核维护一个当前打开的文件和资源的表。每个打开的文件被分配一个简单的数字标识符称为文件描述符。“在系统级,所有文件系统操作都使用这些文件描述符来识别和跟踪每个特定文件.Windows系统使用不同但概念上类似的机制来跟踪资源。为了简化用户的事情,节点.js抽象出操作系统之间的特定差异,并为所有打开的文件分配一个数字文件描述符.fs.open()方法用于分配新的文件描述符。一旦分配,文件描述符可用于从中读取数据,向该文件写入数据或请求有关该文件的信息。)

© www.soinside.com 2019 - 2024. All rights reserved.