node.js - проверьте, существует ли файл перед созданием временного файла

Я хочу создать временный файл/каталог в node.js. Для этого я использую простой алгоритм:

  1. Создайте имя файла на основе pid, времени и случайных символов.
  2. Check if file exists
    • if yes: return to step 1 and repeat
    • если нет: создайте файл и верните его

Вот в чем проблема: в документации node.js для fs.exists явно указано, что fs.exists не следует использовать, а вместо этого следует просто использовать fs.open и отловить потенциальную ошибку: http://nodejs.org/docs/latest/api/fs.html#fs_fs_exists_path_callback

В моем случае я не заинтересован в открытии файла, если он существует, я строго пытаюсь найти имя файла, которого еще нет. Есть ли способ, которым я могу это сделать, не используя fs.exists? В качестве альтернативы, если я использую fs.exists, должен ли я беспокоиться о том, что этот метод станет устаревшим в будущем?


person user2221343    schedule 17.12.2014    source источник
comment
Я сомневаюсь, что с таким форматом имени файла у вас возникнут проблемы с повторяющимися именами файлов.   -  person mscdex    schedule 17.12.2014
comment
Я бы также рекомендовал вам добавить суффикс к имени файла, например _2, а не возвращаться к шагу 1.   -  person micnic    schedule 17.12.2014
comment
@micnic хороший момент, это предотвратит (небольшую) вероятность случайного создания одного и того же имени файла более одного раза. также стоит немного изменить алгоритм, чтобы ограничить максимальное количество попыток :) хотя ради этого вопроса приведенного выше алгоритма достаточно   -  person user2221343    schedule 17.12.2014


Ответы (1)


Вместо этого используйте fs.open с флагами 'wx', чтобы создать файл если он не существует, и вернуть ошибку, если он уже существует.

Таким образом вы исключаете (хотя и незначительную) вероятность того, что файл будет создан между проверкой fs.exists и вызовом fs.open для создания файла.

person JohnnyHK    schedule 17.12.2014
comment
Замечательно! Однако один вопрос: как я могу сказать, что ошибка fs.open связана с тем, что файл уже существует, а не с какой-либо другой ошибкой ввода-вывода (слишком много файлов открыто и т. д.)? - person user2221343; 17.12.2014
comment
@user2221343 user2221343, по сообщению об ошибке, я думаю, можно понять, какая ошибка произошла - person micnic; 17.12.2014
comment
@user2221343 user2221343 Объект ошибки, который вы получите, будет содержать детали, необходимые для различения конкретной ошибки. Создайте небольшой тест, чтобы увидеть, что вы получите в этом случае; это, вероятно, ошибка EEXIST. - person JohnnyHK; 17.12.2014
comment
Только что проверил это; вы правы, здесь можно проверить if (err.code === 'EEXIST'), чтобы определить, что файл уже существует. То же самое возможно с fs.mkdir (для создания временных каталогов) - person user2221343; 17.12.2014