मैं वर्तमान स्क्रिप्ट को Node.js के साथ पथ कैसे प्राप्त करूं?


979

मुझे Node.js में स्क्रिप्ट का रास्ता कैसे मिलेगा?

मुझे पता है process.cwd, लेकिन यह केवल उस निर्देशिका को संदर्भित करता है जहां स्क्रिप्ट को बुलाया गया था, स्क्रिप्ट का नहीं। उदाहरण के लिए, मान लें कि मैं अंदर हूं /home/kyle/और मैं निम्नलिखित कमांड चलाता हूं:

node /home/kyle/some/dir/file.js

अगर मैं फोन करता हूं process.cwd(), मुझे मिलता है /home/kyle/, नहीं /home/kyle/some/dir/। क्या उस निर्देशिका को पाने का कोई तरीका है?


6
स्वीकार किए गए उत्तर के दस्तावेज़ीकरण लिंक नोडjs.org/docs/latest/api/globals.html
allenhwkim

जवाबों:


1392

मैंने इसे फिर से दस्तावेज के माध्यम से देखने के बाद पाया। मैं जिस चीज की तलाश कर रहा था, वह थी __filenameऔर __dirnameमॉड्यूल-स्तरीय चर।

  • __filenameवर्तमान मॉड्यूल का फ़ाइल नाम है। यह वर्तमान मॉड्यूल फ़ाइल का हल निरपेक्ष पथ है। (पूर्व: /home/kyle/some/dir/file.js)
  • __dirnameवर्तमान मॉड्यूल का निर्देशिका नाम है। (पूर्व: /home/kyle/some/dir)

3
यदि आप केवल निर्देशिका नाम और पूर्ण पथ नहीं चाहते हैं, तो आप ऐसा कुछ कर सकते हैं: फ़ंक्शन getCurrentDirectoryName () {var fullPath = __dirname; var path = fullPath.split ('/'); var cwd = path [path.length-1]; वापसी cwd; }
एंथनी मार्टिन

58
@AnthonyMartin __dirname.split ("/")। पॉप ()
19

6
@Apx समाधान (जैसे मैंने किया :) की कोशिश करने वालों के लिए, यह समाधान विंडोज पर काम नहीं करता है।
लाऊजिन

36
या बस__dirname.split(path.sep).pop()
बरगी

47
याrequire('path').basename(__dirname);
व्याचेस्लाव कॉट्रुता

251

तो मूल रूप से आप यह कर सकते हैं:

fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);

'/' या '\' के साथ सहमति के बजाय समाधान () का उपयोग करें अन्यथा आप क्रॉस-प्लेटफ़ॉर्म मुद्दों में चलेंगे।

नोट: __dirname मॉड्यूल या शामिल स्क्रिप्ट का स्थानीय पथ है। यदि आप एक प्लगइन लिख रहे हैं, जिसे मुख्य स्क्रिप्ट का मार्ग जानना आवश्यक है:

require.main.filename

या, बस फ़ोल्डर का नाम पाने के लिए:

require('path').dirname(require.main.filename)

16
यदि आपका लक्ष्य सिर्फ पार्स करना है और json फाइल के साथ इंटरैक्ट करना है, तो आप अक्सर इसे अधिक आसानी से कर सकते हैं var settings = require('./settings.json')। बेशक, यह तुल्यकालिक एफएसओ है, इसलिए इसे रन-टाइम पर न करें, लेकिन स्टार्टअप समय में यह ठीक है, और एक बार लोड होने के बाद, यह कैश हो जाएगा।
isaacs

2
@Marc धन्यवाद! थोड़ी देर के लिए अब मैं अपने रास्ते को इस तथ्य के आसपास हैक कर रहा था कि __dirname प्रत्येक मॉड्यूल के लिए स्थानीय है। मेरी लाइब्रेरी में एक नेस्टेड संरचना है और कई जगहों पर अपने ऐप की जड़ को जानना होगा। खुशी है कि मुझे पता है कि अब यह कैसे करना है: D
Thijs Koerselman

नोड V8: path.dirname (process.mainModule.filename)
wayofthefuture

यदि आप विंडोज़ को एक वास्तविक प्लेटफ़ॉर्म नहीं मानते हैं, तो क्या हम समाधान छोड़ सकते हैं? BSD, Macos, linux, tizen, symbian, Solaris, android, flutter, webos सभी का उपयोग / सही?
रे फॉस


118

यह आदेश वर्तमान निर्देशिका लौटाता है:

var currentPath = process.cwd();

उदाहरण के लिए, फ़ाइल को पढ़ने के लिए पथ का उपयोग करने के लिए:

var fs = require('fs');
fs.readFile(process.cwd() + "\\text.txt", function(err, data)
{
    if(err)
        console.log(err)
    else
        console.log(data.toString());
});

उन लोगों के लिए जो एसिंक्रोनस और सिंक्रोनस को नहीं समझते थे , इस लिंक को देखें ... stackoverflow.com/a/748235/5287072
DarckBlezzer

16
यह वही है जो ओपी नहीं चाहता है ... अनुरोध निष्पादन योग्य स्क्रिप्ट के पथ के लिए है!
कैसरसोल

3
वर्तमान निर्देशिका एक बहुत अलग बात है। यदि आप कुछ चलाते हैं जैसे cd /foo; node bar/test.js, वर्तमान निर्देशिका होगी /foo, लेकिन स्क्रिप्ट में स्थित है /foo/bar/test.js
rjmunro

यह एक अच्छा जवाब नहीं है। यह एक तर्क है कि यह आपकी अपेक्षा से बहुत छोटा रास्ता हो सकता है।
kris_IV

आप ऐसा कभी क्यों करेंगे; यदि फ़ाइल उस वर्तमान निर्देशिका के सापेक्ष थी जिसे आप बस पढ़ सकते थे text.txtऔर यह काम करेगी, तो आपको निरपेक्ष पथ का निर्माण करने की आवश्यकता नहीं है
माइकल Mrozek

102

__Dirname का उपयोग करें !!

__dirname

वर्तमान मॉड्यूल का निर्देशिका नाम। यह पथ.dirname () के समान है __filename

उदाहरण: चल रहे नोड example.js से / उपयोगकर्ता / mjr

console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr

https://nodejs.org/api/modules.html#modules_dirname

ESModules के लिए आप उपयोग करना चाहेंगे: import.meta.url


1
इससे सहानुभूति भी बच जाती है। इसलिए यदि आप एक बिन बनाते हैं और एक फ़ाइल खोजने की आवश्यकता होती है, जैसे path.join (__ dirname, "../example.json"); यह तब भी काम करेगा जब आपका बाइनरी नोड_मॉड्यूस / .बीन में जुड़ा हो
जेसन

2
न केवल वर्षों पहले दिया गया यह उत्तर था, यह अब ES मॉड्यूल के साथ भी काम नहीं करता है
डैन डेस्केल्सस्कु

48

जब यह मुख्य स्क्रिप्ट की बात आती है तो यह उतना ही सरल है:

process.argv[1]

से Node.js प्रलेखन :

process.argv

एक सरणी जिसमें कमांड लाइन तर्क हैं। पहला तत्व 'नोड' होगा, दूसरा तत्व जावास्क्रिप्ट फ़ाइल का पथ होगा । अगले तत्व किसी भी अतिरिक्त कमांड लाइन तर्क होंगे।

यदि आपको किसी मॉड्यूल फ़ाइल का मार्ग जानना है तो __filename का उपयोग करें


3
क्या डाउनवॉटर यह बता सकता है कि यह अनुशंसित क्यों नहीं है?
तमलिन

1
@ टैमलिन शायद इसलिए process.argv[1]केवल मुख्य स्क्रिप्ट पर लागू होता है जबकि __filenameमॉड्यूल फ़ाइल को निष्पादित किया जा रहा है। मैं अंतर पर जोर देने के लिए अपने जवाब को अपडेट करता हूं। फिर भी, मैं उपयोग करने में कुछ भी गलत नहीं देखता हूं process.argv[1]। किसी की आवश्यकताओं पर निर्भर करता है।
लुकाज़ विकटोर

10
यदि मुख्य स्क्रिप्ट PM2 process.argv की तरह एक नोड प्रक्रिया प्रबंधक के साथ शुरू किया गया था [1] प्रक्रिया प्रबंधक /usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js के निष्पादन को इंगित करेगा
user3002996

34

Node.js 10 ECMAScript मॉड्यूल का समर्थन करता है , जहां __dirnameऔर __filenameअब उपलब्ध नहीं हैं

फिर वर्तमान ईएस मॉड्यूल के लिए पथ प्राप्त करने के लिए एक का उपयोग करना होगा:

import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);

और वर्तमान मॉड्यूल युक्त निर्देशिका के लिए:

import { dirname } from 'path';
import { fileURLToPath } from 'url';

const __dirname = dirname(fileURLToPath(import.meta.url));

मुझे कैसे पता चलेगा कि मैं ES मॉड्यूल लिख रहा हूं या नहीं? क्या यह सिर्फ एक बात है कि मैं कौन सा नोड संस्करण चला रहा हूं, या यदि मैं आयात / निर्यात कीवर्ड का उपयोग कर रहा हूं?
एड ब्रानिन

2
ईएस मॉड्यूल केवल --experimental-modulesध्वज के साथ उपलब्ध हैं ।
निकेन्सौल

1
- यदि आप नोड संस्करण चला रहे हैं तो एक्सपेरीमेंटल-मॉड्यूल केवल आवश्यक है <13.2। फ़ाइल को .js के बजाय .mjs नाम दें
ब्रेंट

28
var settings = 
    JSON.parse(
        require('fs').readFileSync(
            require('path').resolve(
                __dirname, 
                'settings.json'),
            'utf8'));

7
बस एक नोट, नोड 0.5 के रूप में आपको बस एक JSON फ़ाइल की आवश्यकता हो सकती है। बेशक, जो इस सवाल का जवाब नहीं देगा।
केविन कॉक्स


24

प्रत्येक Node.js कार्यक्रम के पर्यावरण में कुछ वैश्विक चर होते हैं, जो आपकी प्रक्रिया के बारे में कुछ जानकारी का प्रतिनिधित्व करता है और इसमें से एक है __dirname


न केवल वर्षों पहले दिया गया यह जवाब था, __dirname अब ES मॉड्यूल के साथ काम नहीं करता है
डैन डस्केलस्क्यू

यह NodeJs 10 के बारे में है, लेकिन यह जवाब 2016 में प्रकाशित हुआ था।
हज़ारापेट तुनयाना

मुझे पता है। प्रौद्योगिकी परिवर्तनों के रूप में उत्तर अपडेट किए जा सकते हैं।
दान डैस्कलेस्क्यू

13

मुझे पता है कि यह बहुत पुराना है, और मैं जो मूल प्रश्न का उत्तर दे रहा था, उसे डुप्लिकेट के रूप में चिह्नित किया गया है और यहां निर्देशित किया गया है, लेकिन मैं एक मुद्दे पर भाग गया जो चमेली-पत्रकारों को काम करने की कोशिश कर रहा था और यह विचार पसंद नहीं आया कि मुझे इसमें अपग्रेड करना था यह काम करने के लिए आदेश। मुझे पता चला कि चमेली-संवाददाताओं ने सेवपाथ को सही ढंग से हल नहीं किया था और वास्तव में रिपोर्ट फ़ोल्डर आउटपुट को रूट निर्देशिका के बजाय चमेली-संवाददाताओं की निर्देशिका में डाल रहा था, जहां मैं गपशप करता था। इस कार्य को सही ढंग से करने के लिए मैंने प्रारंभिक करंट वर्किंग डाइरेक्टरी को प्राप्त करने के लिए process.env.INIT_CWD का उपयोग करके समाप्त किया, जो कि वह निर्देशिका होनी चाहिए जहाँ आप भाग गए थे। आशा है कि यह किसी की मदद करता है।

var reporters = require('jasmine-reporters');
var junitReporter = new reporters.JUnitXmlReporter({
  savePath: process.env.INIT_CWD + '/report/e2e/',
  consolidateAll: true,
  captureStdout: true
 });

8

आप वर्तमान ऐप फ़ोल्डर पथ प्राप्त करने के लिए process.env.PWD का उपयोग कर सकते हैं।


2
ओपी ने अनुरोध किया "स्क्रिप्ट के लिए रास्ता"। PWD, जो प्रोसेस वर्किंग डायरेक्टरी जैसी किसी चीज़ के लिए खड़ा है, ऐसा नहीं है। इसके अलावा, "वर्तमान ऐप" फंतासिंग भ्रामक है।
dmcontador

7

यदि आप pkgअपने ऐप को पैकेज करने के लिए उपयोग कर रहे हैं , तो आपको यह अभिव्यक्ति उपयोगी लगेगी:

appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
  • process.pkgबताता है कि क्या ऐप द्वारा पैक किया गया है pkg

  • process.execPathनिष्पादन योग्य का पूरा रास्ता रखता है, जो /usr/bin/nodeस्क्रिप्ट के प्रत्यक्ष आह्वान ( node test.js), या पैक किए गए ऐप के समान है।

  • require.main.filename मुख्य स्क्रिप्ट का पूरा रास्ता रखता है, लेकिन जब नोड इंटरएक्टिव मोड में चलता है तो यह खाली होता है।

  • __dirnameवर्तमान स्क्रिप्ट का पूर्ण पथ रखता है , इसलिए मैं इसका उपयोग नहीं कर रहा हूं (हालांकि यह वही हो सकता है जो ओपी पूछता है; फिर बेहतर appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));है कि इंटरेक्टिव मोड में नोटिंग का उपयोग __dirnameखाली है।

  • इंटरेक्टिव मोड के process.argv[0]लिए, नोड निष्पादन योग्य पथ process.cwd()प्राप्त करने के लिए या वर्तमान निर्देशिका प्राप्त करने के लिए या तो उपयोग करें ।


3

मॉड्यूल की basenameविधि का उपयोग करें path:

var path = require('path');
var filename = path.basename(__filename);
console.log(filename);

यहाँ प्रलेखन ऊपर उदाहरण से लिया गया है।

जैसा कि डैन ने बताया, नोड "-experimental-मॉड्यूल" ध्वज के साथ ECMAScript मॉड्यूल पर काम कर रहा है । नोड 12 अभी भी और ऊपर के रूप में समर्थन करता__dirname__filename है।


यदि आप --experimental-modulesध्वज का उपयोग कर रहे हैं , तो एक वैकल्पिक दृष्टिकोण है

वैकल्पिक वर्तमान ईएस मॉड्यूल के लिए रास्ता पाने के लिए है :

const __filename = new URL(import.meta.url).pathname;

और वर्तमान मॉड्यूल युक्त निर्देशिका के लिए:

import path from 'path';

const __dirname = path.dirname(new URL(import.meta.url).pathname);

-2

यदि आप शेल स्क्रिप्ट में $ 0 जैसे कुछ और चाहते हैं, तो यह प्रयास करें:

var path = require('path');

var command = getCurrentScriptPath();

console.log(`Usage: ${command} <foo> <bar>`);

function getCurrentScriptPath () {
    // Relative path from current working directory to the location of this script
    var pathToScript = path.relative(process.cwd(), __filename);

    // Check if current working dir is the same as the script
    if (process.cwd() === __dirname) {
        // E.g. "./foobar.js"
        return '.' + path.sep + pathToScript;
    } else {
        // E.g. "foo/bar/baz.js"
        return pathToScript;
    }
}

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