仅当Node.js中不存在文件时才能创建文件

我们有一个缓冲区,我们想写一个文件。如果文件已经存在,我们需要增加一个索引,然后再试一次。有没有一种方法来创建一个文件,只有当它不存在,或者我应该只是stat文件,直到我得到一个错误,找到一个不存在已经?

例如,我有文件a_1.jpg和a_2.jpg。我想我的方法尝试创建a_1.jpg和a_2.jpg,并且失败,最后成功地创建a_3.jpg。

理想的方法是这样的:

fs.writeFile(path,data,{ overwrite: false },function (err) {
  if (err) throw err;
  console.log('It\'s saved!');
});

或者这样:

fs.createWriteStream(path,{ overwrite: false });

在节点的fs库中是否存在类似的东西?

编辑:我的问题是,如果有一个单独的功能检查存在。就是这样:在单个文件系统调用中,是否有一种创建文件(如果不存在)的方法

解决方法

由于您的直觉被正确猜测,一对存在/ writeFile调用的天真解决方案是错误的。异步代码以不可预知的方式运行。在特定的情况下它是

>是否有文件a.txt? – 不。
(文件a.txt由另一个程序创建)
>如果可以写入a.txt。 – 好的。

但是,是的,我们可以在一个电话中做到这一点。我们正在使用文件系统,所以阅读fs上的开发人员手册是个好主意。嘿,here’s有趣的一部分。

‘w’ – Open file for writing. The file is created (if it does not
exist) or truncated (if it exists).

‘wx’ – Like ‘w’ but fails if path exists.

所以我们要做的只是添加wx到fs.open调用。但是嘿,我们不喜欢像fopen一样的IO。让我们在fs.writeFile上读一点。

fs.readFile(filename[,options],callback)#

filename String

options Object

encoding String | Null default = null

flag String default = ‘r’

  
  回调函数

那个选项看起来很有希望。所以我们试试

fs.writeFile(path,{ flag: 'wx' },function (err) {
    if (err) throw err;
    console.log("It's saved!");
});

它完美地用于单次写入。我猜这个代码将会失败,但是如果你试图用它来解决你的任务,那么这些代码就会失败。你有一个原子“检查_#。jpg存在,并写在那里,如果它是空的”操作,但所有其他fs状态没有被锁定,并且a_1.jpg文件可能会自动消失,而你已经在检查a_5.jpg。 Most*文件系统不是ACID数据库,事实上,你能够做至少一些原子操作是奇迹。很可能wx代码在某些平台上无法工作。所以为了你的理智,最后使用数据库

一些更多的信息为痛苦

想象一下,我们正在写一些像memoize-fs这样的东西,将文件系统的功能调用结果缓存起来,以节省一些网络/ cpu时间。如果文件存在,我们可以打开文件进行阅读,如果没有,请写入文件?我们来看看那些旗子,经过一段时间的精神锻炼,我们可以看到一个人做了我们想要的:如果文件不存在,它会创建一个文件,并打开它们进行阅读和写入,如果该文件存在,它不会清除文件(如w会)。但是现在我们不能在(smth)文件中,也不能在创建(Smth)Stream函数中使用它。这似乎是一个缺失的功能

所以随便把它作为Node.js github的一个特征请求(甚至一个bug),因为缺少原子异步文件系统API是Node的缺点。尽管don’t expect可以随时更改。

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...