Javascript - Как сделать запись уникальной, добавив число? - PullRequest
0 голосов
/ 01 августа 2020

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

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

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

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

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

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

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

DOC
DOC-1
DOC-2

Если я добавлю файл с именем DO C, новое имя файла будет теперь DO C -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]}`;
  

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Вам нужно будет проверить, заканчивается ли имя файла на -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;
}
1 голос
/ 01 августа 2020

Вы можете объявить объект 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 для создания защищенной области для объекта stati c filenames. Теперь он доступен для всех вызовов makeUnique(), но в остальном "частный", то есть не может быть случайно изменен из любого другого места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...