जावास्क्रिप्ट में ओएस पथ विभाजक कैसे निर्धारित करें?


82

मैं जावास्क्रिप्ट में कैसे बता सकता हूं कि ओएस में जहां स्क्रिप्ट चल रही है वहां कौन सा पथ विभाजक उपयोग किया जाता है?


जब संपूर्ण ब्राउज़र अलगाव के साथ ब्राउज़र के अंदर जावास्क्रिप्ट चलाया जाता है तो आपको इसकी आवश्यकता क्यों है? आप नहीं कर सकते हैं अपने स्थानीय कंप्यूटर से एक्सेस फ़ाइलें ...
LMS

जावास्क्रिप्ट आमतौर पर है, लेकिन हमेशा नहीं, ब्राउज़र में चलता है। ब्राउज़र के बाहर जावास्क्रिप्ट का उपयोग करने वाले कुछ उदाहरण मोज़िला ज़ूलरनर ऐप हैं, जेएस स्क्रिप्ट्स कमांड-लाइन दुभाषिया जैसे वी 8 या डब्ल्यूएसएच, और एएसपी पृष्ठों को जेस्क्रिप्ट में लिखा गया है। जेएस के लिए कई उपयोग हैं।
जोएल अनएयर

मुझे यकीन है कि आप पहले से ही इस मुद्दे को हल कर चुके हैं, लेकिन मैंने आपके प्रश्न और नीचे दिए गए उत्तर के लिए एक उपयोग मामला जोड़ा है, क्योंकि आप की तरह, मुझे पता है कि हमेशा एक ऐसा मामला होता है जहां आप हल करने के लिए OS पर निर्भर नहीं रह सकते हैं आप के लिए विभाजक! :)। चीयर्स!
डीकोड

2
यह सवाल बहुत ही प्रासंगिक है क्योंकि जावास्क्रिप्ट को अक्सर Node.js. के अंदर चलाया जाता है वहां आप फ़ाइल-सिस्टम को एक्सेस करना चाहते हैं, इसलिए पथ-विभाजक मायने रखता है। यदि आप मल्टी-OS Node.js एप्लिकेशन बनाना चाहते हैं तो यह भी दर्द-बिंदुओं में से एक है। Node.js बहु-प्लेटफ़ॉर्म है, लेकिन इसका मतलब यह नहीं है कि कोई भी Node.js प्रोग्राम आपके द्वारा उपयोग किए जाने वाले फ़ाइल-पथ पर विशेष ध्यान दिए बिना, सभी समर्थित OS पर चलता है।
पानू तर्क 15

जवाबों:


20

अफेयर आप हमेशा एक पथ विभाजक के रूप में उपयोग कर सकते हैं, यहां तक ​​कि विंडोज पर भी।

Http://bytes.com/forum/thread23123.html से उद्धरण :

इसलिए, स्थिति को सरल रूप से अभिव्यक्त किया जा सकता है:

  • डॉस 2.0 के बाद से सभी डॉस सेवाएं और सभी विंडोज एपीआई या तो आगे स्लैश या बैकस्लैश स्वीकार करते हैं। हमेशा होना चाहिए।

  • मानक कमांड शेल (CMD या COMMAND) में से कोई भी आगे की स्लैश को स्वीकार नहीं करेगा। यहां तक ​​कि पिछली पोस्ट में दिए गए "cd ./tmp" उदाहरण विफल रहता है।


1
वीवीएस का उत्तर सही है, इंटरनेट एक्सप्लोरर में एक फ़ाइल इनपुट द्वारा दिए गए पथ को पार्स करने के अपवाद के साथ (IE8 के साथ परीक्षण किया गया - मुझे अन्य संस्करणों के बारे में पता नहीं है)। इस स्थिति में, इनपुट तत्व के मान (input.value) द्वारा दिया गया मार्ग "C: \ fakepath \ & lt; फ़ाइल नाम & gt;" के रूप में है। यहाँ नोट करें।
मिलाग्रे

JFYI: cmd.exe विंडोज एक्सपी और विंडोज 7 दोनों पर "cd / windows" (उदाहरण के रूप में) को सही ढंग से हैंडल करता है
यूजीन मेवस्की 'कॉलबैक

2
यह पूरी तरह से सही सवाल का जवाब नहीं है ... नीचे "सही जवाब" देखें :)।
डीकोड

5
मैंने इस जवाब को अस्वीकार कर दिया क्योंकि यह प्रश्न की सही वैधता को नजरअंदाज करता है- अर्थात् ऐसे मामले हैं जहां आपको वास्तव में उपयोग किए जा रहे पथ विभाजक को जानने की आवश्यकता है। उदाहरण के लिए, टुकड़ों में एक पथ को विभाजित करने के लिए विभाजक का उपयोग करने की आवश्यकता होगी।
दर्पण

2
@ वीवीएस - उन परिदृश्यों में काम नहीं करता है जहां आप दोनों प्रकार के स्लैश का उपयोग करते हैं (कम से कम विंडोज 7 पर)। उस मामले पर विचार करें जहां आप __dirname का उपयोग करके एक चर का निर्माण कर रहे हैं और फिर आपको शेष पथ को जोड़ने की आवश्यकता है। उदाहरण के लिए: __dirname + '/ images'। उस उदाहरण में __dirname OS विशिष्ट स्लैश का उपयोग करेगा, लेकिन यदि आप / चित्रों का उपयोग करने का प्रयास करते हैं और आप Windows पर हैं, तो आप c: \ somepath / images जैसे पथ के साथ समाप्त हो जाएंगे, और यह Windows पर काम नहीं करेगा। मैं बस इस मामले में भाग गया, यही कारण है कि मैं इसका उल्लेख करता हूं :)।
dcp

160

प्लेटफ़ॉर्म-विशिष्ट फ़ाइल विभाजक pathको node.jsरिटर्न में मॉड्यूल का उपयोग करें ।
उदाहरण

path.sep  // on *nix evaluates to a string equal to "/"

संपादित करें: नीचे दिए गए सेबास की टिप्पणी के अनुसार, इसका उपयोग करने के लिए, आपको इसे अपने जेएस फ़ाइल के शीर्ष पर जोड़ना होगा:

const path = require('path')

2
आप अपने उत्तर को यह बताकरpath.sep सुधार सकते हैं कि :।
आयनॉ बिज़ुउ

11
const path = require('path');
सेबास

हालांकि मुझे पता है कि मैं '' का उपयोग कर सकता हूं यदि मेरे सभी मामलों में नहीं। जब मैं आउटपुट को फीडबैक या लॉगिंग के लिए कंसोल पर प्रिंट करता हूं। मैं एक ही रास्ते में एक ही स्लैश का उपयोग करना पसंद करता हूं।
b01

मुझे लगता है कि ऊपर सही उत्तर है और सबसे सरल समाधान भी। जैसा कि सेबास द्वारा बताया गया है कि पथ-मॉड्यूल तक पहुंचने के लिए आपको पथ = आवश्यक ('पथ') करना होगा। यदि आप एक Node.programmer, यहां तक ​​कि नौसिखिए हैं, तो आप शायद पहले से ही जानते हैं।
पानू तर्क

7

सही जबाव

हाँ सभी OS की CD ../ या CD .. \ या CD .. स्वीकार करते हैं, भले ही आप विभाजकों में कैसे भी हों। लेकिन एक रास्ता पढ़ने के बारे में क्या। यदि आप कहते हैं कि कैसे पता चलेगा, एक 'विंडोज़' पथ, के साथ ' 'और \अनुमति दी।

स्पष्ट 'दू!' सवाल

जब आप पर निर्भर करते हैं तो क्या होता है, उदाहरण के लिए, इंस्टॉलेशन डायरेक्टरी %PROGRAM_FILES% (x86)\Notepad++। निम्नलिखित उदाहरण लें।

var fs = require('fs');                             // file system module
var targetDir = 'C:\Program Files (x86)\Notepad++'; // target installer dir

// read all files in the directory
fs.readdir(targetDir, function(err, files) {

    if(!err){
        for(var i = 0; i < files.length; ++i){
            var currFile = files[i];

            console.log(currFile); 
            // ex output: 'C:\Program Files (x86)\Notepad++\notepad++.exe'

            // attempt to print the parent directory of currFile
            var fileDir = getDir(currFile);

            console.log(fileDir);  
            // output is empty string, ''...what!?
        }
    }
});

function getDir(filePath){
    if(filePath !== '' && filePath != null){

       // this will fail on Windows, and work on Others
       return filePath.substring(0, filePath.lastIndexOf('/') + 1);
    }
}

क्या हुआ!?

targetDirसूचकांक के बीच सबस्ट्रिंग तक स्थापित किया जा रहा है 0, और 0( indexOf('/')है -1में C:\Program Files\Notepad\Notepad++.exe), खाली स्ट्रिंग में जिसके परिणामस्वरूप।

समाधान...

इसमें निम्न पोस्ट के कोड शामिल हैं: मैं Node.js के साथ वर्तमान ऑपरेटिंग सिस्टम का निर्धारण कैसे करूं

myGlobals = { isWin: false, isOsX:false, isNix:false };

OS का सर्वर साइड डिटेक्शन।

// this var could likely a global or available to all parts of your app
if(/^win/.test(process.platform))     { myGlobals.isWin=true; }
else if(process.platform === 'darwin'){ myGlobals.isOsX=true; }
else if(process.platform === 'linux') { myGlobals.isNix=true; }

OS का ब्राउज़र साइड डिटेक्शन

var appVer = navigator.appVersion;
if      (appVer.indexOf("Win")!=-1)   myGlobals.isWin = true;
else if (appVer.indexOf("Mac")!=-1)   myGlobals.isOsX = true;
else if (appVer.indexOf("X11")!=-1)   myGlobals.isNix = true;
else if (appVer.indexOf("Linux")!=-1) myGlobals.isNix = true;

विभाजक प्राप्त करने के लिए हेल्पर फंक्शन

function getPathSeparator(){
    if(myGlobals.isWin){
        return '\\';
    }
    else if(myGlobals.isOsx  || myGlobals.isNix){
        return '/';
    }

    // default to *nix system.
    return '/';
}

// modifying our getDir method from above...

अभिभावक निर्देशिका (क्रॉस प्लेटफॉर्म) पाने के लिए हेल्पर फंक्शन

function getDir(filePath){
    if(filePath !== '' && filePath != null){
       // this will fail on Windows, and work on Others
       return filePath.substring(0, filePath.lastIndexOf(getPathSeparator()) + 1);
    }
}

getDir() यह जानने के लिए पर्याप्त बुद्धिमान होना चाहिए कि इसकी तलाश क्या है।

यदि उपयोगकर्ता कमांड लाइन, आदि के माध्यम से एक पथ इनपुट कर रहा है, तो आप वास्तव में भी धीमी और जांच कर सकते हैं।

// in the body of getDir() ...
var sepIndex = filePath.lastIndexOf('/');
if(sepIndex == -1){
    sepIndex = filePath.lastIndexOf('\\');
}

// include the trailing separator
return filePath.substring(0, sepIndex+1);

आप ऊपर बताए अनुसार 'पाथ' मॉड्यूल और path.sep का भी उपयोग कर सकते हैं, यदि आप किसी कार्य को इस सरल तरीके से करने के लिए किसी मॉड्यूल को लोड करना चाहते हैं। व्यक्तिगत रूप से, मुझे लगता है कि केवल उस प्रक्रिया से जानकारी की जांच करना पर्याप्त है जो आपके पास पहले से उपलब्ध है।

var path = require('path');
var fileSep = path.sep;    // returns '\\' on windows, '/' on *nix

और थॉट्स ऑल फोल्क्स!


1
मुझे पसंद है कि आपने विभाजक को खोजने के लिए तर्क प्रस्तुत किया, इसे प्रबंधनीय विखंडू में तोड़ दिया। यह एक पेशेवर इंजीनियर के रूप में काम करता है। उसके लिए +1 । इसके अलावा, सवाल की उम्र और एक NodeJSटैग की कमी को देखते हुए - आपने सर्वर और क्लाइंट दोनों के लिए जवाब दिया है । आपका जवाब पूरी तरह से - और वास्तव में - सवाल का जवाब देता है। नोड के लिए, मुझे लगता है कि पथ मॉड्यूल ठीक है, क्योंकि यह उत्पन्न बायोटेक प्रदर्शन को प्रभावित नहीं करेगा और पठनीयता (एक एकल आयात विवरण) को प्रभावित नहीं करना चाहिए। हालाँकि, आप क्लाइंट-साइड का एकमात्र उत्तर हैं। यह स्वीकार किया जाना चाहिए।
रिक

1

जैसा कि पहले ही यहां उत्तर दिया गया है, आप path.joinअपने पथ को मैन्युअल रूप से बनाने के लिए ओएस विशिष्ट पथ विभाजक पा सकते हैं । लेकिन आप path.joinउस काम को करने दे सकते हैं , जो पथ निर्माण से निपटने के दौरान मेरा पसंदीदा समाधान है:

उदाहरण:

const path = require('path');

const directory = 'logs';
const file = 'data.json';

const path1 = `${directory}${path.sep}${file}`;
const path2 = path.join(directory, file);

console.log(path1); // Shows "logs\data.json" on Windows
console.log(path2); // Also shows "logs\data.json" on Windows

-3

बस "/" का उपयोग करें, यह सभी ओएस पर काम करता है जहां तक ​​मुझे पता है।


4
ओपी ने पूछा कि कैसे determine, हर जगह काम करने वाला ऑपरेटर नहीं है :-)
स्टील ब्रेन

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