নোড.জেএস দিয়ে আমি কীভাবে বর্তমান স্ক্রিপ্টের পথ পাব?


979

আমি কীভাবে নোড.জেজে স্ক্রিপ্টের পথ পাব?

আমি জানি process.cwd, কিন্তু এটি কেবলমাত্র সেই ডিরেক্টরিকে বোঝায় যেখানে স্ক্রিপ্টটি ডাকা হত, স্ক্রিপ্টের নয় not উদাহরণস্বরূপ, বলুন যে আমি আছি /home/kyle/এবং আমি নিম্নলিখিত আদেশটি চালাচ্ছি:

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

আমি ফোন দিলে process.cwd()আমি পাই /home/kyle/, না /home/kyle/some/dir/। ডিরেক্টরিটি পাওয়ার কোনও উপায় আছে কি?


6
nodejs.org/docs/latest/api/globals.html গৃহীত উত্তরের ডকুমেন্টেশন লিঙ্ক।
allenhwkim

উত্তর:


1391

আমি আবার এটি ডকুমেন্টেশনগুলির মাধ্যমে দেখেছি। আমি যা খুঁজছিলাম তা হ'ল __filenameএবং __dirnameমডিউল স্তরের ভেরিয়েবল।

  • __filenameবর্তমান মডিউলটির ফাইল নাম। এটি হ'ল বর্তমান মডিউল ফাইলের নিখুঁত নিখুঁত পথ path (প্রাক্তন /home/kyle/some/dir/file.js:)
  • __dirnameবর্তমান মডিউলটির ডিরেক্টরি নাম। (প্রাক্তন /home/kyle/some/dir:)

3
আপনি যদি কেবল ডিরেক্টরি নাম চান এবং পুরো পথটি না চান তবে আপনি এই জাতীয় কিছু করতে পারেন: ফাংশন getCurrentDirectoryName () full var পূর্ণপথ = __ডেরনাম; var পাথ = পূর্ণপথ.স্প্লিট ('/'); var cwd = পাথ [পথ. দৈর্ঘ্য -১]; cwd রিটার্ন; }
অ্যান্টনি মার্টিন

58
@ অ্যান্টনিমার্টিন __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);

'/' বা '\' দিয়ে কথা বলার পরিবর্তে সমাধান () ব্যবহার করুন অন্যথায় আপনি ক্রস-প্ল্যাটফর্ম সমস্যার মধ্যে চলে যাবেন।

দ্রষ্টব্য: __ ডিরেক্টরি নাম মডিউল বা অন্তর্ভুক্ত স্ক্রিপ্টের স্থানীয় পথ। আপনি যদি এমন একটি প্লাগইন লিখছেন যা মূল স্ক্রিপ্টের পথটি জানতে হবে তা হ'ল:

require.main.filename

বা, কেবল ফোল্ডারের নাম পেতে:

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

16
যদি আপনার লক্ষ্যটি কেবল json ফাইলকে বিশ্লেষণ এবং ইন্টারঅ্যাক্ট করা হয় তবে আপনি প্রায়শই এটি আরও সহজেই এর মাধ্যমে করতে পারেন var settings = require('./settings.json')। অবশ্যই এটি সিঙ্ক্রোনাস এফএস আইও, তাই রান-টাইমে এটি করবেন না, তবে শুরু করার সময় এটি ঠিক আছে, এবং এটি লোড হয়ে গেলে এটি ক্যাশে হবে।
ইসাকাক্স

2
@ মার্ক ধন্যবাদ! কিছুক্ষণের জন্য আমি __ডিরনাম প্রতিটি মডিউলের স্থানীয় the আমার লাইব্রেরিতে আমার নেস্টেড কাঠামো রয়েছে এবং আমার অ্যাপ্লিকেশনটির মূলটি বেশ কয়েকটি জায়গায় জানতে হবে। খুশী আমি এখন এটি কীভাবে করব তা জানেন: ডি
থিজ কোয়ারসেলম্যান

নোড ভি 8: পথ.ডিরনাম (প্রক্রিয়া.মাইনমডিউল.ফিলনাম)
ওয়েফথফিউচার

আপনি যদি উইন্ডোজকে একটি বাস্তব প্ল্যাটফর্ম হিসাবে বিবেচনা না করেন, তবে আমরা কি সমাধানটি এড়িয়ে যেতে পারি? বিএসডি, ম্যাকোস, লিনাক্স, টিজেন, সিম্বিয়ান, সোলারিস, অ্যান্ড্রয়েড, বিড়ম্বনা, ওয়েবস সবই ব্যবহার / সঠিক?
রায় ফস


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

এটি একটি ভাল উত্তর না। এটি আপনার প্রত্যাশার চেয়ে অনেক ছোট পথ হতে পারে এটি একটি যুক্তিযুক্ত বিউকিজের গোলমাল।
ক্রিস_আইভি

আপনি কেন কখনও এই কাজ করবেন; যদি ফাইলটি কেবলমাত্র ডিরেক্টরিটি পড়তে পারে text.txtএবং এটি কাজ করতে পারে তার তুলনায় যদি আপনার কাজ করা হয়, তবে আপনাকে পরম পথটি তৈরি করার দরকার নেই
মাইকেল মরোজেক

102

____ নাম ব্যবহার করুন !!

__dirname

বর্তমান মডিউলটির ডিরেক্টরি নাম। এটি এর পথ.ডিরনাম () এর মতো __filename

উদাহরণ: / ব্যবহারকারী / এমজেআর থেকে নোড উদাহরণ চলমান j

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
এটিও প্রতীক থেকে বেঁচে থাকে। সুতরাং আপনি যদি একটি বাক্স তৈরি করেন এবং কোনও ফাইল সন্ধানের প্রয়োজন হয়, যেমন পথ.জয়াইন (__ dirname, "../example.json"); আপনার বাইনারি নোড_মডিউলগুলি / .বিনে লিঙ্ক করা থাকলে এটি এখনও কাজ করবে
জেসন

2
এই উত্তরটি কয়েক বছর আগে দেওয়া হয়েছিল কেবল তাই নয়, এটি আর মডিউলগুলির সাথে আর কাজ করে না
ড্যান ড্যাসক্লেস্কু

48

এটি যখন মূল স্ক্রিপ্টে আসে তখন এটি এতটা সহজ:

process.argv[1]

থেকে Node.js ডকুমেন্টেশন :

process.argv

কমান্ড লাইন যুক্তিযুক্ত একটি অ্যারে। প্রথম উপাদানটি হবে 'নোড', দ্বিতীয় উপাদানটি জাভাস্ক্রিপ্ট ফাইলের পথ হবে । পরবর্তী উপাদানগুলি কোনও অতিরিক্ত কমান্ড লাইন আর্গুমেন্ট হবে।

আপনার যদি কোনও মডিউল ফাইলের পথ জানতে হয় তবে __ ফাইলিনামটি ব্যবহার করুন


3
ডাউনভাইটার দয়া করে ব্যাখ্যা করতে পারেন কেন এটি সুপারিশ করা হয়নি?
তামিলেন

1
@ টমলিন সম্ভবত মডিউল ফাইল কার্যকর করার process.argv[1]সময় শুধুমাত্র মূল স্ক্রিপ্টে প্রযোজ্য কারণ হতে পারে __filename। আমি পার্থক্য জোর দেওয়ার জন্য আমার উত্তর আপডেট। তবুও, আমি ব্যবহারে কোনও ভুল দেখছি না process.argv[1]। কারও প্রয়োজনীয়তার উপর নির্ভর করে।
লুকাস উইক্টর

10
যদি প্রধান স্ক্রিপ্টটি নোড প্রসেস ম্যানেজারের সাথে pm2 প্রসেস.আরজিভি [1] এর সাথে প্রবর্তন করা হয় তবে প্রক্রিয়া পরিচালকের
এক্সার

33

10 সমর্থন node.js নাম ECMAScript মডিউল , যেখানে __dirnameএবং __filenameআর পাওয়া যাবে

তারপরে বর্তমান ES মডিউলটির পথটি পেতে ব্যবহার করতে হবে:

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));

আমি কীভাবে জানতে পারি যে আমি ইএস মডিউলটি লিখছি কিনা? আমি যে কোন নোড সংস্করণটি চালিয়ে যাচ্ছি এটিই কি আমি আমদানি / রফতানি কীওয়ার্ড ব্যবহার করছি?
এড ব্রান্নিন

2
ES মডিউলগুলি কেবল --experimental-modulesপতাকা সহ উপলভ্য ।
নিকনসোল 16

1
- এক্সপেরিমেন্টাল-মডিউলগুলি কেবল তখনই প্রয়োজন যখন আপনি নোড সংস্করণটি চালাচ্ছেন <13.2। শুধু .js এর চেয়ে ফাইল .mjs এর নাম দিন
ব্রেন্ট

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

7
নোড ০.০ হিসাবে কেবল একটি নোটের জন্য আপনাকে কেবল একটি JSON ফাইলের প্রয়োজন হতে পারে। অবশ্যই যে প্রশ্নের উত্তর দেয় না।
কেভিন কক্স 21


24

প্রতিটি নোড.জেএস প্রোগ্রামের পরিবেশে কিছু বৈশ্বিক পরিবর্তনশীল থাকে যা আপনার প্রক্রিয়া সম্পর্কে কিছু তথ্য উপস্থাপন করে এবং এর মধ্যে একটি __dirname


এই উত্তরটি কয়েক বছর আগে দেওয়া হয়েছিল কেবল তাই নয়, __dirname ইএস মডিউলগুলির সাথে আর কাজ করে না
ড্যান ড্যাসকলেসকু

এটি নোডজেএস 10 সম্পর্কিত, তবে এই উত্তরটি 2016 সালে প্রকাশিত হয়েছিল
হাজারারপেট টুনানিয়ান

আমি জানি. প্রযুক্তি পরিবর্তন হিসাবে উত্তরগুলি আপডেট করা যেতে পারে।
ড্যান ড্যাসক্লেস্কু

13

আমি জানি এটি বেশ পুরানো, এবং আমি যে মূল প্রশ্নের উত্তর দিচ্ছিলাম সেটিকে নকল হিসাবে চিহ্নিত করা হয়েছে এবং এখানে নির্দেশনা দেওয়া হয়েছে, তবে আমি জুঁই-সাংবাদিকদের কাজ করার চেষ্টা করার মতো একটি সমস্যার মধ্যে পড়েছিলাম এবং আমার এই ধারণাটি পছন্দ হয়নি যে আমাকে ডাউনগ্রেড করতে হবে এটি কাজ করার জন্য আদেশ। আমি জানতে পেরেছিলাম যে জুঁই-সাংবাদিকরা সেভপথটি সঠিকভাবে সমাধান করছে না এবং আমি যেখানে ডুবে গিয়েছি তার মূল ডিরেক্টরিটির পরিবর্তে জেসমিন-রিপোর্টার্স ডিরেক্টরিতে প্রতিবেদন ফোল্ডার আউটপুটটি রাখছিল। এই কাজটি সঠিকভাবে করার জন্য আমি প্রসেস.ইন.ভি.আইএনআইসিসিএইচডি ব্যবহার করে প্রারম্ভিক চলতি কার্যনির্বাহী ডিরেক্টরিটি পেয়েছি যা আপনার ডিরেক্টরিতে পরিচালিত হওয়া ডিরেক্টরি হতে হবে। আশা করি এটি কাউকে সাহায্য করবে।

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

8

আপনি বর্তমান অ্যাপ্লিকেশন ফোল্ডারের পাথ পেতে প্রসেস.এনভি.পিডাব্লুডি ব্যবহার করতে পারেন।


2
ওপি অনুরোধকৃত "স্ক্রিপ্টের পথ" চেয়েছে। পিডব্লিউডি, যা প্রসেস ওয়ার্কিং ডিরেক্টরীর মতো কিছু বোঝায়, তা নয়। এছাড়াও, "বর্তমান অ্যাপ" ফরাসিং বিভ্রান্তিকর।
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);

এখানে উপরোক্ত উদাহরণ থেকে নেওয়া ডকুমেন্টেশন এখানে রয়েছে।

ড্যান ইঙ্গিত হিসাবে, নোড "- এক্সপেরিমেন্টাল-মডিউল" পতাকাটি সহ 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;
    }
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.