¿Los nodejs obtienen el nombre del archivo de la ruta absoluta?

289

¿Si hay alguna API que pueda recuperar el nombre del archivo de una ruta de archivo absoluta?

por ejemplo "foo.txt"de"/var/www/foo.txt"

Sé que funciona con la operación de cadena, fullpath.replace(/.+\//, '') pero quiero saber si hay una forma más 'formal', como file.getName()en Java, podría hacerlo.

¿NodeJS obtiene el nombre del archivo de la ruta absoluta?

fxp
fuente

Respuestas:

542

Use el basenamemétodo del pathmódulo:

path.basename('/foo/bar/baz/asdf/quux.html')
// returns
'quux.html'

Aquí está la documentación del ejemplo anterior.

Victor Stanciu
fuente
108
Si también desea eliminar la extensión:path.basename(fpath, path.extname(fpath))
Waylon Flinn
33

Para obtener la parte del nombre del archivo, se usa el método basename:

var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var file = path.basename(fileName);

console.log(file); // 'python.exe'

Si desea el nombre del archivo sin la extensión, puede pasar la variable de extensión (que contiene el nombre de la extensión) al método de nombre base que le dice a Node que devuelva solo el nombre sin la extensión:

var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var extension = path.extname(fileName);
var file = path.basename(fileName,extension);

console.log(file); // 'python'
Rubin Bhandari
fuente
4

Si ya sabe que el separador de ruta es /( es decir, está escribiendo para una plataforma / entorno específico), como lo implica el ejemplo en su pregunta, podría mantenerlo simple y dividir la cadena por separador:

'/foo/bar/baz/asdf/quux.html'.split('/').pop()

Eso sería más rápido (y más limpio) que reemplazarlo por una expresión regular.

Nuevamente: solo haga esto si está escribiendo para un entorno específico; de lo contrario, use el pathmódulo, ya que las rutas son sorprendentemente complejas. Windows, por ejemplo, admite /en muchos casos, pero no para, por ejemplo, los \\?\?prefijos de estilo utilizados para carpetas de red compartidas y similares. En Windows, el método anterior está condenado al fracaso, tarde o temprano.

León
fuente
1
Windows tiene \ como separador de carpetas
OwnageIsMagic
1
@OwnageIsMagic Sí, por eso escribo “Si ya sabes que el separador de ruta es /” ... :)
leo
1
No está claro lo que quisiste decir con esta declaración. Esto produce código dependiente de la plataforma que fallará silenciosamente en otras plataformas
OwnageIsMagic
@OwnageIsMagic Sí, de hecho lo hace. Utilice siempre los métodos del módulo de ruta si no está escribiendo para una plataforma específica.
leo
Windows en realidad acepta
separadores de
3
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;

Le da el nombre del archivo sin extensión, si necesita el nombre con uso de extensión

var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.basename(filepath);
Kevin Muchwat
fuente
0

En NodeJS, __filename.split (/ \ | //). Pop () devuelve solo el nombre del archivo desde la ruta absoluta del archivo en cualquier plataforma del sistema operativo. ¿Por qué debemos preocuparnos por recordar / importar una API mientras este enfoque de expresiones regulares también nos permite recordar nuestras habilidades de expresiones regulares?

Visv M
fuente
1
Por favor, elabore su respuesta.
JJ por Transparencia y Mónica
0

Entonces, Nodejs viene con la variable global predeterminada llamada '__fileName'que contiene el archivo actual que se está ejecutando. Mi consejo es pasar el __fileName a un servicio desde cualquier archivo, para que la recuperación del fileName sea dinámica

A continuación, utilizo la cadena fileName y luego la divido en función de path.sep. Tenga en cuenta path.sep evita problemas con los separadores de archivos posix y los separadores de archivos de Windows (problemas con '/' y '\'). Es mucho mas limpio. Obtener la subcadena y obtener solo el último nombre separado y restarlo con la longitud actulal por 3 habla por sí mismo.

Puede escribir un servicio como este (tenga en cuenta que esto está en mecanografiado, pero puede escribirlo en js)

export class AppLoggingConstants {

    constructor(){

    }
      // Here make sure the fileName param is actually '__fileName'
    getDefaultMedata(fileName: string, methodName: string) {
        const appName = APP_NAME;
        const actualFileName = fileName.substring(fileName.lastIndexOf(path.sep)+1, fileName.length - 3);
        //const actualFileName = fileName;
     return appName+ ' -- '+actualFileName;
    }


}

export const AppLoggingConstantsInstance = new AppLoggingConstants();
Joey587
fuente