How to determine the OS path separator in JavaScript?

前端 未结 5 1815
你的背包
你的背包 2020-12-15 02:21

How can I tell in JavaScript what path separator is used in the OS where the script is running?

5条回答
  •  误落风尘
    2020-12-15 02:45

    The Correct Answer

    Yes all OS's accept CD ../ or CD ..\ or CD .. regardless of how you pass in separators. But what about reading a path back. How would you know if its say, a 'windows' path, with ' ' and \ allowed.

    The Obvious 'Duh!' Question

    What happens when you depend on, for example, the installation directory %PROGRAM_FILES% (x86)\Notepad++. Take the following example.

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

    What happened!?

    targetDir is being set to a substring between the indices 0, and 0 (indexOf('/') is -1 in C:\Program Files\Notepad\Notepad++.exe), resulting in the empty string.

    The Solution...

    This includes code from the following post: How do I determine the current operating system with Node.js

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

    Server side detection of 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; }
    

    Browser side detection of 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;
    

    Helper Function to get the separator

    function getPathSeparator(){
        if(myGlobals.isWin){
            return '\\';
        }
        else if(myGlobals.isOsx  || myGlobals.isNix){
            return '/';
        }
    
        // default to *nix system.
        return '/';
    }
    
    // modifying our getDir method from above...
    

    Helper function to get the parent directory (cross platform)

    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() must be intelligent enough to know which its looking for.

    You can get even really slick and check for both if the user is inputting a path via command line, etc.

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

    You can also use 'path' module and path.sep as stated above, if you want to load a module to do this simple of a task. Personally, i think it sufficient to just check the information from the process that is already available to you.

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

    And Thats All Folks!

提交回复
热议问题