كيفية تحديد فاصل مسار نظام التشغيل في جافا سكريبت؟

StackOverflow https://stackoverflow.com/questions/125813

  •  02-07-2019
  •  | 
  •  

سؤال

كيف يمكنني معرفة جافا سكريبت ما هو فاصل المسار المستخدم في نظام التشغيل حيث يتم تشغيل البرنامج النصي؟

هل كانت مفيدة؟

المحلول

يمكنك دائمًا استخدام / كفاصل للمسار، حتى على نظام التشغيل Windows.

اقتباس من http://bytes.com/forum/thread23123.html:

لذلك ، يمكن تلخيص الموقف بدلاً من ذلك:

  • جميع خدمات DOS منذ DOS 2.0 وجميع واجهات برمجة تطبيقات Windows تقبل إما إلى الأمام الملاذ أو التراجع.غالبا يملك.

  • لن يقبل أي من قذائف الأوامر القياسية (CMD أو الأمر) المائلات للأمام.حتى مثال "CD ./TMP" الوارد في منشور سابق يفشل.

نصائح أخرى

يستخدم path الوحدة النمطية في node.js تقوم بإرجاع فاصل الملفات الخاص بالنظام الأساسي.
مثال

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

يحرر:وفقًا لتعليق Sebas أدناه، لاستخدام هذا، تحتاج إلى إضافة هذا في أعلى ملف js الخاص بك:

const path = require('path')

الجواب الصحيح

نعم جميع أنظمة التشغيل تقبل CD ../ أو CD ..\ أو CD ..بغض النظر عن كيفية تمرير الفواصل.ولكن ماذا عن قراءة طريق العودة.كيف يمكنك معرفة ما إذا كان مسار "النوافذ" يقول ' ' و \ مسموح.

واضحة "duh!" سؤال

ماذا يحدث عندما تعتمد على دليل التثبيت، على سبيل المثال %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 };

الكشف عن جانب الخادم لنظام التشغيل.

// 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; }

الكشف عن جانب المتصفح لنظام التشغيل

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

وهذا كل الناس!

إجابة VVS صحيحة، باستثناء تحليل المسار المعطى عن طريق إدخال ملف في Internet Explorer (تم اختباره باستخدام IE8 - لا أعرف شيئًا عن الإصدارات الأخرى).في هذه الحالة، يكون المسار المعطى بواسطة قيمة عنصر الإدخال (input.value) بالصيغة "C:\fakepath\<filename>".لاحظ الخطوط المائلة العكسية هنا.

ما عليك سوى استخدام "/"، فهو يعمل على جميع أنظمة التشغيل على حد علمي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top