Javascript - Как бы вы сделали запись уникальной, добавив номер?

2020-08-01 javascript node.js typescript

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

Но вместо использования метки времени я хочу использовать порядковый суффикс или добавить число к имени файла.

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

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

Hellworldfilename - 1593024232 - метка времени слишком длинная, не очень хорошая идея.

Это должно основываться на существующих записях в базе данных. Если, например, я добавлю файл с именем Hellworldfilename и он уже существует, то новым именем файла будет Hellworldfilename-1, а если я снова добавлю Hellworldfilename, новым именем файла будет Hellworldfilename-2 и так далее, и так далее. Любая идея, как мы можем сделать имя файла каждый раз уникальным?

Позвольте мне привести пример. скажем, у меня есть 3 файла в базе данных с именем файла

DOC
DOC-1
DOC-2

Если я добавлю файл с именем файла DOC, новое имя файла будет теперь DOC-3.

# Код для проверки существования файла

const file = await context.service.Model.findOne({
    where: { humanId: record.id, filename: data.filename },
    paranoid: false,
  });

if (file) {
    const prefix = Date.now().toString();
    // eslint-disable-next-line no-undef
    const fileParts = data.filename.split('.');
    filename = `${fileParts[0]}-${prefix}.${fileParts[1]}`;
  

Answers

Вы можете объявить filenames объекта в глобальной области видимости

const filenames={};

и использовать его для отслеживания уже открытых файлов.

Ниже я определил функцию makeUnique() освещает идеи, которые я упоминал здесь ранее. Оказывается, мне пришлось немного подправить свой код, но вот рабочий фрагмент:

const makeUnique=(function(){
 const filenames={};
 return function(fn){
  const fileParts=fn.split(".");
  const prefix=filenames[fn]!=null
  ? ++filenames[fn]
  : filenames[fn]=0;
  if (prefix) fileParts[Math.max(fileParts.length-2,0)]+='-'+prefix;
  return fileParts.join('.')
 }
})();

console.log(["abc","d.e.f.c","abc","ghi","abc","abc.txt","def",
             "abc.txt","d.e.f.c","abc.txt","abc"].map(makeUnique))
.as-console-wrapper {max-height:100% !important}

Я использовал IIFE для генерации защищенной области filenames статических объектов. Теперь это доступно всем вызовам makeUnique() но в остальном «private», то есть не может быть случайно изменено из другого места.

Вам нужно проверить, заканчивается ли имя файла на -somenumber. Если это так, то вы можете извлечь это число и увеличить его. В противном случае положите 1 в результат:

function getNumberedFileName(fileN) {
    //These are value initializations to cope with the situation when the file does not have a .
    var fileName = fileN;
    var fileExtension = "";
    var lastDotIndex = fileN.lastIndexOf(".");
    if ((lastDotIndex > 0) && (lastDotIndex < fileN.length - 1)) { //We are not interested in file extensions for files without an extension hidden in UNIX systems, like .gitignore and we are not interested in file extensions if the file ends with a dot
        fileName = fileN.substring(0, lastDotIndex);
        fileExtension = "." + fileN.substring(lastDotIndex + 1);
    }
    var lastDashIndex = fileName.lastIndexOf("-");
    if ((lastDashIndex > 0) && (lastDashIndex < fileName.length - 1)) {
        var lastPart = fileName.substring(lastDashIndex + 1);
        if (!isNaN(lastPart)) {
            var index = parseInt(lastPart) + 1;
            return fileName.substring(0, lastDashIndex) + "-" + index + fileExtension;
        }
    }
    return fileName + "-1" + fileExtension;
}

Related