Как не перезаписывать файл в node.js

Я хочу, чтобы этот код менял имя файла, если файл существует, а не перезаписывал его.

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!');
});

Как я могу сделать функцию «fileExists», учитывая, что fs.exists() теперь устарела, а fs.statSync() или fs.accessSync() выдает ошибку, если файл не существует. Может быть, есть лучший способ добиться этого?


person Viesturs Knopkens    schedule 09.12.2015    source источник
comment
Такие функции обычно не нужны, так как другой процесс может легко создать или удалить файл между вашей проверкой его существования и последующей попыткой его обработки — похоже, это причина того, что он устарел в node. Я не знаком с fs в node.js (следовательно, это комментарий, а не ответ), но обычно существует версия функции, такая как writeFile, которая имеет параметры для указания своего поведения, если файл уже существует.   -  person James Thorpe    schedule 09.12.2015


Ответы (1)


используйте writeFile с третьим аргументом, равным {flag: "wx"} (см. fs.open для обзора флагов). Таким образом, происходит сбой, когда файл уже существует, а также избегается возможное состояние гонки, когда файл создается между вызовами exists и writeFile.

Пример кода для записи файла под другим именем, когда он уже существует.

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();
person Fabian Schmitthenner    schedule 09.12.2015
comment
Флаги задокументированы в разделе fs.open API. - person Gary; 09.12.2015
comment
Позвольте мне просто добавить, что кодировка, режим и флаг являются частями объекта параметров. Это будет один параметр объекта вместо дополнительного параметра. Это может быть полезно для упоминания кодировки изображения. fs.writeFile(path.join(part1, part2), img_data, { encoding: "base64", flag: "wx" }, function (err) { }) - person Max Bender; 11.02.2019