Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

233
Vistas
copiar un archivo/objeto y cambiar el nombre

Estoy haciendo una API para una galería; entonces, creo un método que permite copiar una imagen de la base de datos. Ahora, quiero agregar un número al final del nombre de la imagen copiada. Por ejemplo:

 -original image name: image -copy image name: image(1) -2nd copy image name: image(2)

¿Cómo puedo agregar el número al nombre del nombre copiado automáticamente?

 'use strict' let imageObject= require('../models/image-object'); let fs=require('fs'); let path= require('path'); let gallery_controllers={ copyImage:function(req,res){ //get the id param of the image to copy let imageId=req.params.id; if(imageId==null) return res.status(404).send({message:"no ID defined"}); //I search the requiere image on the database imageObject.findById(imageId,(err,image)=>{ if(err) return res.status(500).send({message:'err to response data'}); if(!image) return res.status(404).send({message:'image not found'}); if(image){ //set a new model-object let imageCopied= new imageObject(); imageCopied.name= image.name; imageCopied.image=image.image; //save image copied on the database imageCopied.save((err,image_copied)=>{ if(err) return res.status(500).send({message:"error 500"}); if(!image_copied) return res.status(404).send({message:"error 404"}); return res.status(200).send({ image:image_copied }) }) } }) }, }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Aquí hay una función que busca en el directorio que se le pasó archivos con el nombre de file(nnn) donde nnn es una secuencia de dígitos y le devuelve la ruta completa del siguiente en secuencia (el que está después del número más alto que ya existe).

Esta función crea previamente un archivo de marcador de posición con ese nombre para evitar problemas de simultaneidad con varias operaciones asincrónicas que llaman a esta función y pueden generar conflictos (si solo devuelve el nombre del archivo sin crear el archivo). Para manejar aún más los conflictos, crea el archivo de marcador de posición en un modo que falla si ya existe (por lo que solo una invocación de esta función creará ese archivo en particular) y automáticamente vuelve a intentar encontrar un nuevo número si tiene un conflicto (p. ej. alguien más creó el siguiente archivo disponible antes de que llegáramos a él). Toda esta lógica es para evitar las sutilezas de las posibles condiciones de carrera al crear el siguiente nombre de archivo en la secuencia.

Una vez que la persona que llama tiene un nombre de archivo único al que se resuelve, se espera que sobrescriba el contenido del marcador de posición con su propio contenido.

 // pass directory to look in // pass base file name so it will look for next in sequence as in "file(3)" // returns the full path of the unique placeholder file it has created // the caller is then responsible for that file // calling multiple times will create a new placeholder file each time async function findNextName(dir, base) { let cntr = 0; const cntr_max = 5; const regex = new RegExp(`^${base}\\((\\d+)\\)$`); async function run() { const files = await fs.promises.readdir(dir); let highest = 0; for (let f of files) { let matches = f.match(regex); if (matches) { let num = parseInt(matches[1]); if (num > highest) { highest = num; } } } let name = `${base}(${highest + 1})`; // create placeholder file with this name to avoid concurrency issues // of another request also trying to use the same next file try { // write to file, fail if the file exists due to a concurrency issue const fullPath = path.resolve(path.join(dir, name)); await fs.promises.writeFile(fullPath, "placeholder", { flag: "wx" }); return fullPath; } catch (e) { // if this fails because of a potential concurrency issue, then try again // up to cntr_max times to avoid looping forever on a persistent error if (++cntr < cntr_max) { return run(); } else { throw e; } } } return run(); }

Podrías llamarlo así:

 findNextName(".", "file").then(filename=> { console.log(filename); }).catch(err => { console.log(err); });
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda