Node.js - obteniendo el nombre de archivo actual


Respuestas:


231

Node.js proporciona una API estándar para hacerlo: Path .

Obtener el nombre del script actual es fácil:

var path = require('path');
var scriptName = path.basename(__filename);

¿No obtiene esto el nombre de base en lugar del nombre de archivo real?
— Phil

10
para un script llamado script.js, obtendrá script.js. Si desea tener el nombre solo sin extensión, ya que estamos hablando aquí de un jsguión que puede usar var scriptName = path.basename(__filename, '.js');ovar scriptName = path.basename(__filename, path.extname(__filename))
— herve

6
otra forma de eliminar la extensión:path.parse(__filename).name
— RH Becker

__filenameno está definido en un módulo ES6.
— Cullub

1
@Cullub, extracto de la documentación de nodejs : estas CommonJSvariables no están disponibles en los módulos ES. Se pueden crear equivalentes de __filenamey __dirnamedentro de cada archivo mediante import.meta.url.
— Herve

46

dentro de un módulo, puede hacer cualquiera de las siguientes acciones para obtener la ruta completa con el nombre de archivo

this.filename;
module.filename;
__filename;

Si solo desea el nombre real sin ruta o extensión, puede hacer algo como esto.

module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);

4
Probablemente quieras usar path.sep para hacerlo multiplataforma. Esto es lo que hice __filename.slice (__ filename.lastIndexOf (path.sep) +1);
— Ryan

2
Para aquellos que solo quieran copiar y pegar este muy útil de una sola línea, no se olviden de hacerlo de var path = require('path');antemano o de cambiarlo amodule.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3);
— forrestranger

17
el -3 asume una longitud de extensión, algo como esto podría funcionar mejorpath.basename(module.filename, path.extname(module.filename))
— dre

32

Para obtener solo el nombre del archivo. Ningún módulo adicional simplemente:

// abc.js
console.log(__filename.slice(__dirname.length + 1));

 // abc
console.log(__filename.slice(__dirname.length + 1, -3));

Esto es por lo que vine aquí. ¡Gracias!
— leviathanbadger

1
Esta debería ser la respuesta aceptada. Funciona en modo estricto. Muy sencillo. ¡Gracias!
— Mateo

3
A menos que su extensión no tenga 2 caracteres, lo cual es totalmente posible porque puede vincular la interpretación del script a cualquier extensión de archivo que desee ... por lo que puede que esta no sea una buena solución general.
— ErikE

24
'use strict';

const scriptName = __filename.split(/[\\/]/).pop();

Explicación

console.log(__filename);
// 'F:\__Storage__\Workspace\StackOverflow\yourScript.js'
const parts = __filename.split(/[\\/]/);
console.log(parts);
/*
 * [ 'F:',
 *   '__Storage__',
 *   'Workspace',
 *   'StackOverflow',
 *   'yourScript.js' ]
 *
**/

Aquí usamos la función de división con expresión regular como primer parámetro.
La expresión regular que queremos para el separador es [\/](dividida por /o \) pero el /símbolo debe escaparse para distinguirlo del terminador de expresiones regulares /, entonces /[\\/]/.

const scriptName = __filename.split(/[\\/]/).pop(); // Remove the last array element
console.log(scriptName);
// 'yourScript.js'

No use esto

Realmente debería usar path.basenameen su lugar ( documentado por primera vez en Node.js v0.1.25 ), porque maneja todos los casos de esquina que no desea conocer, como nombres de archivo con barras en el interior (por ejemplo, archivo llamado "foo \ bar" en unix). Vea la pathrespuesta anterior .


Agregue una explicación
— Daniel Cheung

@DanielCheung ¡Aquí tienes! Pero realmente todo esto se puede buscar en Internet, solo busque en Google javascript splity comience.
— ilyaigpetrov

3
Te estaba ayudando ... -_- Tu respuesta fue votada a favor de la eliminación. Una respuesta no explicar lo suficiente o simplemente el código que contiene se consigue eliminar.
— Daniel Cheung

3

También puede mirar consola-plus . Esto agrega el nombre de archivo y el número de lino a cualquier texto de registro y tiene diferentes colores para .log, .info y .error.


Muy genial. Instale con "npm install --save console-plus", o si estás usando yarn: "yarn add console-plus"
— Andrew Faulkner

1

Bueno, quería usar el nombre del archivo como etiqueta para el registrador, así que lo más sencillo y lo que quería es esto:

__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))

1

Sé que ya ha pasado mucho tiempo, pero lo que hice fue __filename.split('\\').pop(). Esto obtendrá la ruta completa con el nombre del archivo, divídalo y \luego obtenga el último índice que será su nombre de archivo.


1
En macOS__filename.split('/').pop()
— Reece Daniels

1

puede usar esta función para obtener el nombre del archivo:

/**
 * @description 
 * get file name from path
 * @param {string} path path to get file name
 * @returns {string} file name
 * @example 
 * getFileName('getFileName/index.js') // => index.js
 */
export default function getFileName(path) {
    return path.replace(/^.*[\\\/]/, '');
}

si usa nodejs, puede instalar el paquete que incluye esta función https://www.npmjs.com/package/jotils

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.