__dirname দিয়ে path.join বনাম path.resolve


142

একটা পার্থক্য যখন ব্যবহার করছে উভয় path.join এবং path.resolveসঙ্গে __dirnameNode.js মধ্যে সুনির্দিষ্ট পাথ সমাধানে জন্য?

এর মতো ব্যবহার করার সময় তাদের কোনওটি পছন্দ করা উচিত (নিখুঁত পাথ রেজোলিউশনগুলি 90% ব্যবহারের ক্ষেত্রে হয়)?

অর্থাত

const absolutePath = path.join(__dirname, some, dir);

বনাম

const absolutePath = path.resolve(__dirname, some, dir);

উভয় পদ্ধতিই পথটিকে স্বাভাবিক করে তোলে।

এটি এই প্রশ্নের সদৃশ নয় কারণ গৃহীত উত্তরটি ভুল।



উত্তর:


152

হ্যাঁ ফাংশনগুলির মধ্যে পার্থক্য রয়েছে তবে আপনি এই ক্ষেত্রে যেভাবে তাদের ব্যবহার করছেন তা একই ফলাফলের ফলস্বরূপ।

path.joinদুটি পাথ একসাথে একত্রিত করে একটি সাধারণীকৃত পথ ফেরত দেয়। এটি একটি পরম পাথ ফিরে আসতে পারে, তবে এটি অগত্যা সর্বদা এটি করে না।

এই ক্ষেত্রে:

path.join('app/libs/oauth', '/../ssl')

সমাধান করে app/libs/ssl

path.resolveঅন্যদিকে, একটি নিখুঁত পথের সংকল্প করবে।

উদাহরণস্বরূপ, আপনি যখন চালান:

path.resolve('bar', '/foo');

ফিরে আসা পথটি /fooযেহেতু এটিই প্রথম পরম পথ যা নির্মাণ করা যেতে পারে।

তবে, আপনি যদি চালান:

path.resolve('/bar/bae', '/foo', 'test');

ফিরে আসা পথটি আবার হবে /foo/testকারণ এটিই প্রথম পরম পথ যা ডান থেকে বামে তৈরি হতে পারে।

আপনি যদি এমন কোনও পথ সরবরাহ না করেন যা রুট ডিরেক্টরিটি নির্দিষ্ট করে তবে resolveফাংশনে প্রদত্ত পাথগুলি বর্তমান চলমান ডিরেক্টরিটিতে যুক্ত করা হবে। সুতরাং যদি আপনার কাজের ডিরেক্টরিটি ছিল /home/mark/project/:

path.resolve('test', 'directory', '../back');

সমাধান করে

/home/mark/project/test/back

ব্যবহার করা __dirnameহ'ল উত্স ফাইল যুক্ত ডিরেক্টরিটির পরম পথ path আপনি যখন ব্যবহার করেন path.resolveবা path.joinআপনি যদি একই পথটি অনুসরণ করেন তবে তারা একই ফলাফল ফিরে আসবে __dirname। এই জাতীয় ক্ষেত্রে এটি সত্যিই কেবল পছন্দের বিষয়।


25
নীট: __dirnameহ'ল উত্স ফাইল যুক্ত ডিরেক্টরিটির নিখুঁত পথ যা বর্তমান কার্যক্ষম ডিরেক্টরি নয় । প্রাক্তনটি সর্বদা একরকম থাকবে (আপনি যদি ফাইলটি সরান না); পরবর্তীটি একটি প্রক্রিয়া-বিস্তৃত পরামিতি যা আপনি নোডটি কীভাবে চালু করেছিলেন এবং আপনি এটি পরিবর্তন করেছেন কিনা তা নির্ভর করে তারতম্য হয় ।
— josh3736

2
তাই সেখানে মধ্যে কোন পার্থক্য নেই __dirnameএবং path.resolve(__dirname)?
— georaldc

1
@ জোরাল্ডসি: আমি একটিটি পেয়েছি: নোড <<< "পাথ = প্রয়োজন ('পাথ'); কনসোল.লগ (__ ডর্মনাম); কনসোল.লগ (প্যাথ.স্রোসল (__ ডর্মনেম))"
— কলিন

8
আমি এটি বলার জন্য ঘৃণা করি, তবে এই উত্তরটি আমার কাছে সত্যিকার অর্থে কোনও অর্থবোধ করে না এবং আমি কিছু স্পষ্টতার প্রশংসা করব। আপনি মন্তব্য করেছেন যে path.resolve('/bar/bae', '/foo', 'test');মূলত প্রথম যুক্তিটি বাতিল করে দেয় কারণ /foo/test"ডান থেকে বাম দিকে গঠিত হতে পারে এমন প্রথম পরম পথ", তবে কেন আপনি ব্যাখ্যা করেন নি , তাই আমি কার্যত যুক্তিটি বুঝতে পারি না। আমি বোঝাতে চাইছি যে আপনি যে অনুমানমূলক ডিরেক্টরি কাঠামোটি উদাহরণ হিসাবে ব্যবহার করছেন তাতে আমার কোনও দৃষ্টিভঙ্গি নেই, তাই আমি কেন /bar/bae/foo/testঅবৈধ তা ভাবতে পারি না ।
— অস্থায়ী_ ব্যবহারকারী_নাম

3
@temporary_user_name উত্তর এখানে সঠিক path.resolveআচরণ সম্পর্কে সঠিক : path.resolveডান-সর্বাধিক যুক্তি থেকে সঞ্চালিত হয়, আর্গুমেন্ট তালিকার মাধ্যমে বাম-ওয়ার্ডগুলিকে সরিয়ে নিয়ে এবং প্রতিটি যুক্তির মান একটি নিখুঁত পথ পর্যন্ত প্রেরণ করে (যেমন মূল ডিরেক্টরি থেকে শুরু করে /বা [উইন্ডোজ বিশেষত: ] একটি ড্রাইভ লেটার) নির্মিত হয়, তারপরে সেই পথটি ফেরত দেয়। এটি উপেক্ষা করে /bar/baeকারণ সেই বিন্দুতে এর ইতিমধ্যে পরম পথ রয়েছে /foo/testএবং তাই আরও এগিয়ে যাওয়ার কোনও কারণ দেখেনি।
— জেমি রিডিং

23
const absolutePath = path.join(__dirname, some, dir);

বনাম

const absolutePath = path.resolve(__dirname, some, dir);

path.joinকনক্যাটেনেট হবে __dirnameযা বর্তমান মান সঙ্গে ঘনিভূত ফাইলের ডিরেক্টরি নাম someএবং dirপ্ল্যাটফর্ম নির্দিষ্ট বিভাজক সঙ্গে।

যেখানে হিসাবে

path.resolveপ্রক্রিয়া হবে __dirname, someএবং dirঅর্থাত ডান দিক থেকে প্রক্রিয়াকরণের দ্বারা এটি prepending বামে।

যদি মানের কোনও মান someবা dirমূলের সাথে সম্পর্কিত হয় তবে পূর্বের পথটি বাদ দেওয়া হবে এবং এটিকে মূল হিসাবে বিবেচনা করে বিশ্রামের প্রক্রিয়া করা হবে

ধারণাটি আরও ভালভাবে বুঝতে আমাকে নীচে আরও দুটোকে আরও বিশদভাবে ব্যাখ্যা করতে দাও: -

path.joinএবং path.resolveদুটি ভিন্ন পদ্ধতি বা পথ মডিউল কার্যাবলী nodejs দ্বারা উপলব্ধ করা হয়।

যেখানে উভয়ই পথের একটি তালিকা গ্রহণ করে তবে ফলাফলের মধ্যে পার্থক্য আসে অর্থাৎ তারা কীভাবে এই পথে প্রক্রিয়া করে।

path.joinপ্ল্যাটফর্ম নির্দিষ্ট বিভাজককে ডিলিমিটার হিসাবে ব্যবহার করে প্রদত্ত সমস্ত পাথ অংশকে একত্রে সংযুক্ত করে, তারপরে ফলাফলটি সরল করে তোলে। path.resolve()প্রক্রিয়াটি যখন ডান থেকে বাম দিকে পাথের ক্রম করে, প্রতিটি পরের পাথ একটি নিখুঁত পাথ নির্মাণ না করা অবধি প্রবর্তিত হয়।

যখন কোন যুক্তি সরবরাহ করা হয় না

নিম্নলিখিত উদাহরণটি আপনাকে উভয় ধারণাটি পরিষ্কারভাবে বুঝতে সহায়তা করবে: -

আমার ফাইলের নামটি index.jsএবং বর্তমান কার্যকরী ডিরেক্টরিটিE:\MyFolder\Pjtz\node

const path = require('path');

console.log("path.join() : ", path.join());
// outputs .
console.log("path.resolve() : ", path.resolve());
// outputs current directory or equalent to __dirname

ফলাফল

λ node index.js
path.join() :  .
path.resolve() :  E:\MyFolder\Pjtz\node

path.resolve()পদ্ধতি ইচ্ছা আউটপুট পথটি যেখানে path.join()আয়। যদি কিছু সরবরাহ না করা হয় তবে বর্তমান ওয়ার্কিং ডিরেক্টরিটি উপস্থাপন করছে

যখন কিছু মূল পাথ আর্গুমেন্ট হিসাবে পাস করা হয়

const path=require('path');

console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));

ফলাফল i

λ node index.js
path.join() :  abc\bcd
path.resolve() :  E:\bcd

path.join()কেবলমাত্র প্ল্যাটফর্ম নির্দিষ্ট বিভাজকের সাথে ইনপুট তালিকার সাথে সম্মতি জানানো হয় যখন path.resolve()প্রক্রিয়াটি ডান থেকে বামে পথের ক্রম প্রক্রিয়া করে, প্রতিটি পরবর্তী পাথ একটি পরম পাথ নির্মাণ না হওয়া অবধি প্রবর্তন করা হয়।


প্রশ্নটি ছিল বিশেষত পথ.জইন বনাম পথ সম্পর্কিত __dirname সহ সমাধান ।
— এস্তাস ফ্লাস্ক

আপডেটের জন্য আপনার মন্তব্যের উপর ভিত্তি করে উত্তরটি আপডেট করেছিলাম
— সামুয়েলজ90

3

এর জন্য ডক থেকে path.resolve:

ফলাফলটি রুট ডিরেক্টরিতে সমাধান না করা হলে ফলাফলটি স্বাভাবিক করা হয় এবং অনুসরণীয় স্ল্যাশগুলি সরানো হয়।

তবে path.joinস্ল্যাশ পিছনে রাখে

সুতরাং

__dirname = '/';
path.join(__dirname, 'foo/'); // '/foo/'
path.resolve(__dirname, 'foo/'); // '/foo'

এই প্রসঙ্গে 'নরমালাইজড' শব্দের অর্থ কী?
— অ্যাপোলো

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