【问题标题】:How to not overwrite file in node.js如何不覆盖 node.js 中的文件
【发布时间】:2016-03-15 05:25:56
【问题描述】:

如果文件存在而不是覆盖它,我想让这段代码更改文件名。

var fileName = 'file';

fs.writeFile(fileName + '.txt', 'Random text', function (err) {
  if (err) throw err;
  console.log('It\'s saved!');
});

类似:

var fileName = 'file',
    checkFileName = fileName,
    i = 0;

while(fileExists(checkFileName + '.txt')) {
  i++;
  checkFileName = fileName + '-' + i;
} // file-1, file-2, file-3...

fileName = checkFileName;

fs.writeFile(fileName + '.txt', 'Random text', function (err) {
  if (err) throw err;
  console.log('It\'s saved!');
});

考虑到fs.exists() 现在已弃用并且fs.statSync()fs.accessSync() 会在文件不存在时抛出错误,我该如何创建“fileExists”函数。也许有更好的方法来实现这一点?

【问题讨论】:

  • 这样的功能通常是不必要的,因为另一个进程可以在您检查文件是否存在然后尝试处理它之间轻松创建或删除文件 - 似乎这就是它在 node.js 中被弃用的原因。我不熟悉 node.js 中的 fs (因此这是评论而不是答案),但通常会有一个版本的函数,例如 writeFile,如果文件已经存在,它可以选择指定其行为

标签: javascript node.js fs


【解决方案1】:

使用writeFile 并将第三个参数设置为{flag: "wx"}(有关标志的概述,请参阅fs.open)。这样,当文件已经存在时它会失败,并且它还避免了在 existswriteFile 调用之间创建文件的可能竞争条件。

当文件已经存在时以不同名称写入文件的示例代码。

fs = require('fs');


var filename = "test";

function writeFile() {
  fs.writeFile(filename, "some data", { flag: "wx" }, function(err) {
    if (err) {
      console.log("file " + filename + " already exists, testing next");
      filename = filename + "0";
      writeFile();
    }
    else {
      console.log("Succesfully written " + filename);
    }
  });

}
writeFile();

【讨论】:

  • 这些标志记录在 API 的 fs.open 部分中。
  • 让我补充一点,“编码”、“模式”和“标志”是“选项”对象的一部分。这将是一个对象参数而不是附加参数。它对于提及图像编码很有用。 fs.writeFile(path.join(part1, part2), img_data, { encoding: "base64", flag: "wx" }, function (err) { })
猜你喜欢
  • 2016-05-12
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
相关资源
最近更新 更多