Listar Archivos De Una Carpeta Nodejs

0 views
Skip to first unread message
Message has been deleted

Christian Erdmann

unread,
Jul 10, 2024, 9:33:53 AM7/10/24
to grunakector

Introduccin: En este artculo, te mostraremos cmo listar todos los archivos y carpetas de una ruta especfica en Node.js. Para ello, utilizaremos el mdulo fs de Node.js, que nos permite trabajar con el sistema de archivos de nuestro sistema operativo. Aprenders cmo escanear todos los archivos y carpetas en una ruta y guardar la informacin en un archivo JSON.

listar archivos de una carpeta nodejs


Descargar - https://bltlly.com/2yOsRi



La funcin scanDirs toma una ruta de directorio como entrada y utiliza la funcin fs.readdirSync para obtener una lista de todos los archivos y carpetas en ese directorio. Luego, recorre esta lista y utiliza la funcin fs.lstatSync para obtener informacin sobre cada archivo y carpeta. Si el archivo o carpeta es un directorio, la funcin llama a s misma para escanear ese directorio tambin. La informacin de cada archivo y carpeta se almacena en un objeto y se agrega a un arreglo.

Una vez que se han escaneado todos los archivos y carpetas, la informacin se convierte en formato JSON utilizando la funcin JSON.stringify. Finalmente, se utiliza la funcin fs.writeFile para guardar la informacin en un archivo llamado resultado.json.

Ahora que sabes cmo listar todos los archivos y carpetas de una ruta especfica en Node.js, podrs utilizar este conocimiento en tus proyectos futuros. Esperamos que este artculo te haya sido til y que puedas poner en prctica lo que has aprendido. No dudes en compartir este artculo con otros desarrolladores!

We also use third-party cookies that help us analyze how you use this website, store your preferences, and provide the content and advertisements that are relevant to you. These cookies will only be stored in your browser with your prior consent.

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No s ustedes, pero siempre hay un par de cosas que nunca recuerdo exactamentecomo hacer independiente de que framework o lenguaje est usando. Una deellas es subida de archivos. Siempre depende de alguna librera o de algnpatrn o de permisos especiales o algo que se me olvida.

Si te fijas, usamos npx que es una utilidad de NPM para descargar y almismo tiempo ejecutar una herramienta CLI que estdisponible en el registro NPM sin necesidad de instalarla de manera global.npx es una herramienta relativamente nueva al momento de escribir estepost, por lo que me aseguro de destacarlo.

El cdigo generado por express-generator viene con dos rutas routes/home.jsy routes/users.js nosotros usaremos home para tener una pgina de inicio,pero no usaremos el de users ya que no tendremos usuarios en esta aplicacin,por lo que le cambiaremos el nombre a upload.js

Definimos un endpoint GET /upload que realiza unrender de un formulario que crearemos ms adelante,por ahora terminamos las modificaciones ajustando las referencias deapp.js para que quede de la siguiente manera (se muestran las lineasantiguas comentadas sobre las nuevas)

Las lneas antiguas estn comentadas aqu de modo ilustrativo. No seasdesprolijo y elimina esas lneas de tu cdigo! Dejar cdigo muerto encomentarios es como que un cocinero no lavara sus platos, excepto claro,el riesgo de muerte.

A diferencia el mtodo GET que hicimos anteriormente, esta vez debemosrecibir el archivo que enva el formulario. Esto no tiene soporte nativo enexpress, ya que intenta ser lo ms pequeo posible y debemos ir agregando lafuncionalidad a medida que la vamos necesitando mediante mdulos.

Uno de los puntos ms comunes de extensin para express son los Middlewareque son bsicamente funciones que reciben ciertos parmetros establecidos yretornan algo establecido. Estas funciones se van apilando una a otra y vanmodificando los objetos req y res y el ltimo en la cadena el el mtodoque uno especifica como manejador. Eso es una explicacin sencilla de unprrafo y es muy simplista, pero es lo bsico.

El mdulo que utilizaremos es multer yse encarga justamente de interpretar los datos que enva el formulario ygenerar un archivo temporal donde nosotros le indiquemos que contieneexactamente lo que el usuario ha enviado.

Puedes ver que como segundo parmetro en vez de una nuestra funcin colocamosun arreglo con multer.single y un string que dice attachment. La segundaposicin para argumentos a las rutas de express puede ser un middleware o unarreglo de middleware. Incluso cuando es uno a mi me gusta especificarlo conun arreglo para distinguirlo bien. Luego, la instruccin multer.single haceuso del mdulo multer para configurar un middleware que recibe un solo archivoy finalmente el string attachment es el nombre del campo del formulario quemulter deber buscar que tendr el contenido del archivo.

Por defecto multer dejar el archivo en la carpeta que especificamos y generarun nombre de archivo aleatorio. Luego de escrito, modificar req paraagregarle una propiedad req.file que podemos usar para consultar este nombre,la ruta y otra metadata del archivo y realizar mayor procesamiento.

En particular, nos interesa el nombre original que el archivo tena segn lo queinforme el formulario, para usar el mismo nombre en disco (ya que es un ejemplo)pero en una aplicacin real puede ser utilizado para guardar un registro en labase de datos con esta metadata y mantener en disco el nombre aleatorio (quetiene ciertas garantas de ser un nombre nico)

En el segundo bloque, agregamos una lnea para extraer el nombre de archivo(notar el uso de un de-constructor, es innecesario en este ejemplo, podramossolo retornar el string, pero me he acostumbrado a usarlos por defecto ya queen general permite una extensibilidad ms alta del retorno para una funcin).En res.remder estamos haciendo uso de este nombre para entregarlo a la vistade OK para que pueda desplegar un mensaje de xito.

NO! este cdigo es un asco! tenemos un post que enva directo una vista yadems tenemos cdigo sncrono que nos bloquear el hilo mientras procesael renombrado. En nodejs queremos aprovechar al mximo las capacidadesasncronas, as que continuemos

Arreglemos primero algo sencillo. Tenemos un post que est directamenteentregando una respuesta HTTP con cuerpo. Esto es un anti-patrn debido a quelos navegadores van a re-intentar el POST si el usuario hace una recarga dela pgina y tendremos un archivo duplicado, adems que el POST quedar en elhistorial del navegador para ser ejecutado quizs cuando en el futuro cuandomenos lo esperemos.

Para reparar esto, se implementa el patrn POST-Redirect-GET en la cual seestablece que el POST en vez de responder con un status 200 y contenido HTML,responde un Redirect 302 (o 301) hacia un GET que tiene el mensaje de xito.Cuando un navegador recibe un redirect como respuesta a un POST, el navegadorno guarda en el historial el POST sino que directamente el GET hacia donde fueredirigido, lo que evita el inconveniente por completo.

En este caso, al procesar el archivo, realizaremos un redirect haciaGET /upload/success con un parmetro query fileName que contenga el nombredel archivo subido que luego podemos rescatar y desplegar en la vista.Normalmente en un sitio de verdad, este parmetro sera almacenado en alsesin en vez de usar el query y borrado una vez ejecutada la vista para que nose despliegue nuevamente, pero esto es solo un ejercicio y no estamos usandosesiones.

Notar que agregamos una lnea para transformar el nombre de archivo segncodificacin URI para que no tengamos problemas con caracteres no-ascii ennuestro parmetro. Esto es exclusivamente debido a que lo estamos enviando porquery.

En nuestra funcin storeWithOriginalName estamos realizando un renombradodel archivo que multer genera para dejarlo con el nombre que el formularioinforma como nombre original. Esto lo estamos haciendo con el mtodorenameSync que bloquea la ejecucin hasta que la operacin de disco estcompleta, y para este caso de ejercicio est bien, pero para una aplicacinde verdad sera un problema. Por eso vamos a corregirlo y usar su funcinhermana rename, pero para ello vamos a necesitar re-estructurar algo denuestro cdigo.

Primero, importamos util que es un mdulo nativo de nodejs y por lo tantono necesitamos instalarlo con NPM. Este mdulo tiene varias funcionesde utilidad para distintos propsitos, nosotros utilizaremos una en particular:promisify que convierte una funcin que acepta callbacks hacia una funcinque retorna promesas.

Los callbacks son la forma ms antigua en nodejs de soportar asincrona, peroest en desuso debido a que hace muy compleja la escritura y lectura del cdigo,especialmente cuando hay varias cosas ocurriendo de manera condicional enrespuesta a un evento asncrono

Las promesas son una sintaxis distinta que tiene soporte nativo en nodejs desdehace un buen tiempo, pero muchas de las funciones nativas de nodejs aunexponen la API con callbacks para otorgar retro-compatibilidad.

Una tercera sintaxis es la de async/await que no veremos en este ejemplodebido a que aun no estoy personalmente 100% cmodo con ella aun y hay algunosdetalles que aun no aprendo bien (especialmente el control de errores), perono es difcil de implementar una vez has convertido a promesas.

En la tercera lnea usamos util.promisify para que fs.rename sea convertidode callbacks a promesas y en la quinta lnea ejecutamos rename e inmediatamenteanidamos una continuacin con .then que toma el resultado de rename, lodescarta y en vez retorna nuevamente el nombre original del archivo. Esto esdebido a que rename en realidad no retorna nada y es conveniente que las promesasretornen algun dato que sea relevante para el procesamiento posterior de susresultados. En este caso el nombre original nos sienta muy bien.

Luego de terminar storeWithOriginalName anidamos una continuacin que recibeel nombre original del archivo y se lo entrega a encodeURIComponent quien retorna el nombre codificado y en una segundacontinuacin tomamos ese nombre codificado y enviamos de vuelta inmediatamenteun redirect.

d3342ee215
Reply all
Reply to author
Forward
0 new messages