Tengo una lista de archivos que me gustaría convertir, recreando la estructura de directorio anidada original. Estoy usando la versión de promises del módulo fs y uso código asíncrono tanto como sea posible. Mi código actual se ve así:
import fs from 'fs/promises'; import path from 'path'; const sourceFiles = [ // big list of file paths here ]; const allDone = Promise.all( sourceFiles.map( async (srcFile) => { const destFile = path.join('dest', srcFile); const destDir = path.dirname(destFile); // Async existence check with 'access' in try/catch block, since we don't have fs.exists try { await fs.access(destDir); } catch (e) { await fs.mkdir(destDir); } return myConversionFunction( srcFile, destFile); } ) ); Recibo errores de que el directorio ya existe, probablemente porque hay una condición de carrera entre fs.access y fs.mkdir cuando se ejecutan varias Promesas "en paralelo".
Podría resolver esto llamando a mkdir con {recursive: true} , pero eso intentaría crear el directorio en cada archivo.
También podría iterar sobre la lista de archivos dos veces, creando una lista de directorios de destino y luego simplemente mapear sobre myConversionFunction . Pero eso se siente ineficiente para listas de archivos grandes.
¿Hay una mejor manera de crear directorios condicionalmente?