Node.js - वर्तमान फ़ाइल नाम प्राप्त करना


121

वर्तमान फ़ाइल नाम, फ़ंक्शन नाम और लाइन नंबर कैसे प्राप्त करें?

मैं इसका उपयोग लॉगिंग / डीबगिंग उद्देश्य के लिए करना चाहता हूं __FILE__, __LINE__ सी के बराबर


जवाबों:


230

Node.js ऐसा करने के लिए एक मानक API प्रदान करता है: पथ

वर्तमान स्क्रिप्ट का नाम प्राप्त करना तब आसान है:

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

क्या यह वास्तविक फ़ाइल नाम के बजाय बेसन नहीं मिलता है?
फिल

10
नाम की स्क्रिप्ट के लिए script.js, आपको मिलेगा script.js। आप केवल विस्तार के बिना नाम करना चाहते हैं के रूप में हम यहाँ एक की बात कर रहे हैं jsस्क्रिप्ट आप उपयोग कर सकते हैं var scriptName = path.basename(__filename, '.js');याvar scriptName = path.basename(__filename, path.extname(__filename))
Herve

6
एक्सटेंशन छोड़ने का एक और तरीका:path.parse(__filename).name
आरएच बेकर

__filenameईएस 6 मॉड्यूल में परिभाषित नहीं किया गया है।
कुलुब

1
@ कुल्ब, नोडज डॉक्यूमेंटेशन से एक्सट्रैक्ट : ये CommonJSवेरिएबल ES मॉड्यूल में उपलब्ध नहीं हैं। के समकक्ष __filenameऔर __dirnameप्रत्येक फ़ाइल के माध्यम से बनाया जा सकता है import.meta.url
झुंड

46

एक मॉड्यूल के भीतर आप फ़ाइलनाम के साथ पूर्ण पथ प्राप्त करने के लिए निम्न में से कोई भी कर सकते हैं

this.filename;
module.filename;
__filename;

यदि आप केवल वास्तविक नाम को बिना किसी पथ या विस्तार के चाहते हैं तो आप ऐसा कुछ कर सकते हैं।

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

4
आप शायद इसे पार मंच बनाने के लिए path.sep का उपयोग करना चाहते हैं। यहाँ मैंने क्या किया __filename.slice (__ फ़ाइल का नाम .lastIndexOf (path.sep) +1);
रेयान

2
उन लोगों के लिए जो केवल इस सुपर-वन-लाइनर को कॉपी और पेस्ट करना चाहते हैं, var path = require('path');या तो पहले से भूल न जाएं या इसे बदल देंmodule.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3);
forrestranger

17
-3 विस्तार की लंबाई मानता है, इस तरह से कुछ बेहतर काम कर सकता हैpath.basename(module.filename, path.extname(module.filename))
dre

32

केवल फ़ाइल नाम प्राप्त करने के लिए। कोई अतिरिक्त मॉड्यूल बस:

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

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

यह वही है जिसके लिए मैं यहां आया था। धन्यवाद!
लेविथानबर्गर

1
यह स्वीकृत उत्तर होना चाहिए। सख्त मोड में काम करता है। बहुत सीधा है। धन्यवाद!
मैथ्यू

2
जब तक आपका एक्सटेंशन 2 वर्ण लंबा नहीं होता है, जो पूरी तरह से संभव है क्योंकि आप स्क्रिप्ट की व्याख्या को किसी भी फ़ाइल एक्सटेंशन के साथ जोड़ सकते हैं जो आप चाहते हैं ... तो यह एक अच्छा ऑल-अराउंड समाधान नहीं हो सकता है।
एरिक

24
'use strict';

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

व्याख्या

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

यहां हम पहले पैरामीटर के रूप में नियमित अभिव्यक्ति के साथ विभाजन फ़ंक्शन का उपयोग करते हैं । विभाजक के लिए हम जो नियमित अभिव्यक्ति चाहते हैं, वह है (द्वारा विभाजित या ) लेकिन प्रतीक को रेगेक्स टर्मिनेटर से अलग करने के लिए बच जाना चाहिए , इसलिए ।
[\/]/\///[\\/]/

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

यह प्रयोग न करें

आपको वास्तव में path.basenameइसके बजाय (पहले Node.js v0.1.25 में प्रलेखित ) का उपयोग करना चाहिए , क्योंकि यह उन सभी कोने के मामलों को संभालता है, जिनके बारे में आप फाइलनाम के बारे में नहीं जानना चाहते हैं जैसे कि अंदर स्लैश के साथ फाइल (जैसे कि यूनिक्स पर "foo \ bar" नाम की फ़ाइल)। देखें pathजवाब ऊपर


कृपया स्पष्टीकरण जोड़ें
डैनियल चेउंग

@DanielCheung आप यहाँ हैं! लेकिन वास्तव में यह सब इंटरनेट पर खोज योग्य है, बस Google javascript splitऔर जा रहा है।
ilaigpetrov

3
मैं आपकी सहायता कर रहा था ... -_- आपके उत्तर को हटाने के लिए मतदान किया जा रहा था। पर्याप्त या बस युक्त कोड नहीं समझाने वाला उत्तर हटा दिया जाएगा
डैनियल चेउंग

3

आप कंसोल-प्लस को भी देख सकते हैं । यह किसी भी लॉगिंग टेक्स्ट में फ़ाइल नाम और लिनेनंबर जोड़ता है। इसमें .log, .info और andor के लिए अलग-अलग रंग होते हैं।


बहुत अच्छा। "Npm install --save कंसोल-प्लस" के साथ इंस्टॉल करें, या यदि आप यार्न का उपयोग कर रहे हैं: "यार्न ऐड कंसोल-प्लस"
एंड्रयू फॉल्कनर

1

खैर, मैं फ़ाइल नाम का उपयोग लकड़हारा के लिए टैग के रूप में करना चाहता था ताकि सबसे सीधे आगे हो और जो मैं चाहता था वह यह है:

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

1

मुझे पता है कि यह पहले ही एक लंबा समय हो चुका है, लेकिन मैंने जो किया है __filename.split('\\').pop()। यह फ़ाइलनाम के साथ पूर्ण पथ प्राप्त करेगा, इसे \तब तक विभाजित करें जब तक कि अंतिम सूचकांक प्राप्त न हो जाए जो आपका फ़ाइल नाम होगा।


1
MacOS पर__filename.split('/').pop()
रीस डेनियल

1

आप फ़ाइल नाम प्राप्त करने के लिए इस फ़ंक्शन का उपयोग कर सकते हैं:

/**
 * @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(/^.*[\\\/]/, '');
}

यदि आप नोडज का उपयोग करते हैं, तो आप उस पैकेज को स्थापित कर सकते हैं जिसमें यह फ़ंक्शन शामिल है https://www.npmjs.com/package/jotils

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.