Làm thế nào để xác định dấu phân cách đường dẫn hệ điều hành trong JavaScript?


81

Làm cách nào để biết trong JavaScript, dấu phân tách đường dẫn nào được sử dụng trong hệ điều hành nơi tập lệnh đang chạy?


Tại sao bạn cần điều này khi Javascript được chạy bên trong trình duyệt với hệ điều hành cách ly hoàn toàn? Bạn không thể truy cập tệp từ máy tính cục bộ của mình ...
lms

JavaScript thường nhưng không phải lúc nào cũng chạy trong trình duyệt. Một số ví dụ về việc sử dụng JavaScript bên ngoài trình duyệt là ứng dụng Mozilla XULRunner, tập lệnh js chạy bằng trình thông dịch dòng lệnh như V8 hoặc WSH và các trang ASP được viết bằng JScript. Có rất nhiều cách sử dụng cho JS.
Joel Anair 24/09/08

Tôi chắc rằng bạn đã giải quyết được sự cố, nhưng tôi đã thêm một trường hợp sử dụng cho câu hỏi của bạn và câu trả lời bên dưới, bởi vì giống như bạn, tôi biết luôn có trường hợp bạn không thể phụ thuộc vào Hệ điều hành để giải quyết phân cách cho bạn! :). Chúc mừng!
giải mã vào

1
Câu hỏi này rất phù hợp vì JavaScript thường được chạy bên trong Node.js. Ở đó, bạn có thể và muốn truy cập vào hệ thống tệp, vì vậy dấu phân cách đường dẫn rất quan trọng. Đây cũng là một trong những điểm khó khăn nếu bạn muốn tạo các ứng dụng Node.js đa hệ điều hành. Node.js là đa nền tảng nhưng điều đó không có nghĩa là bất kỳ chương trình Node.js nào cũng chạy trên tất cả các hệ điều hành được hỗ trợ mà bạn không cần quan tâm đặc biệt đến đường dẫn tệp mà bạn sử dụng.
Panu Logic

Câu trả lời:


20

Afair bạn luôn có thể sử dụng / làm dấu phân cách đường dẫn, ngay cả trên Windows.

Trích dẫn từ http://bytes.com/forum/thread23123.html :

Vì vậy, tình huống có thể được tóm tắt khá đơn giản:

  • Tất cả các dịch vụ DOS kể từ DOS 2.0 và tất cả các API Windows đều chấp nhận dấu gạch chéo lên hoặc dấu gạch chéo ngược. Luôn luôn có.

  • Không có trình bao lệnh tiêu chuẩn nào (CMD hoặc COMMAND) chấp nhận dấu gạch chéo về phía trước. Ngay cả ví dụ "cd ./tmp" được đưa ra trong một bài viết trước đó cũng không thành công.


1
Câu trả lời của VVS là đúng, ngoại trừ việc phân tích cú pháp một đường dẫn được cung cấp bởi một đầu vào tệp trong trình khám phá internet (đã thử nghiệm với IE8 - tôi không biết về các phiên bản khác). Trong trường hợp này, đường dẫn được cung cấp bởi giá trị của phần tử đầu vào (input.value) có dạng "C: \ fakepath \ & lt; filename & gt;". Lưu ý các dấu gạch chéo ngược ở đây.
Milagre

JFYI: cmd.exe xử lý "cd / windows" (làm ví dụ) một cách chính xác trên cả Windows XP và Windows 7.
Eugene Mayevski 'Callback

2
Đây không phải là câu trả lời ĐÚNG hoàn toàn cho câu hỏi đã đặt ra ... xem "Câu trả lời Đúng" Dưới đây :).
giải mã

5
Tôi đã phản đối câu trả lời này vì nó bỏ qua tính hợp lệ hoàn hảo của câu hỏi - cụ thể là có những trường hợp bạn thực sự cần biết dấu phân cách đường dẫn đang được sử dụng. Ví dụ: cần chia một đường dẫn thành nhiều phần sẽ sử dụng dấu phân tách.
MirroredFate

2
@VVS - Không hoạt động trong các trường hợp bạn sử dụng cả hai loại dấu gạch chéo (ít nhất là trên Windows 7). Hãy xem xét trường hợp bạn đang tạo một biến bằng __dirname và sau đó bạn cần nối phần còn lại của đường dẫn. Ví dụ: __dirname + '/ images'. Trong ví dụ đó __dirname sẽ sử dụng dấu gạch chéo dành riêng cho hệ điều hành, nhưng nếu bạn cố gắng sử dụng / images và đang sử dụng Windows, bạn sẽ kết thúc với một đường dẫn như c: \ somepath / images và điều đó sẽ không hoạt động trên Windows. Mình mới gặp trường hợp này nên mới nhắc đến :).
dcp

158

Sử dụng pathmô-đun để node.jstrả về dấu tách tệp dành riêng cho nền tảng.
thí dụ

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

Chỉnh sửa: Theo nhận xét của Sebas bên dưới, để sử dụng cái này, bạn cần thêm cái này ở đầu tệp js của bạn:

const path = require('path')

2
Bạn có thể cải thiện câu trả lời của bạn quy định cụ thể như thế nào:path.sep .
Ionică Bizău

11
const path = require('path');
Sebas

Mặc dù tôi biết tôi có thể sử dụng '/' trong hầu hết các trường hợp, nếu không phải tất cả các trường hợp của tôi. Khi tôi in kết quả ra bảng điều khiển để phản hồi hoặc ghi nhật ký. Tôi thích sử dụng các dấu gạch chéo giống nhau trong một đường dẫn đầy đủ.
b01

Tôi nghĩ ở trên là đáp án chính xác và cũng là giải pháp đơn giản nhất. Như đã chỉ ra bởi Sebas để có quyền truy cập vào mô-đun đường dẫn, bạn phải thực hiện path = request ('path'). Nếu bạn là một Node.programmer, thậm chí là người mới, có thể bạn đã biết điều đó.
Panu Logic

7

Câu trả lời đúng

Có, tất cả các hệ điều hành đều chấp nhận CD ../ hoặc CD .. \ hoặc CD .. bất kể bạn đi như thế nào trong dấu phân cách. Nhưng đọc một con đường trở lại thì sao. Làm thế nào bạn biết nếu nói của nó, một đường dẫn 'cửa sổ', với ' '\được phép.

'Duh!' Câu hỏi

Điều gì xảy ra khi bạn phụ thuộc vào, ví dụ, thư mục cài đặt %PROGRAM_FILES% (x86)\Notepad++. Lấy ví dụ sau.

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

Chuyện gì đã xảy ra!?

targetDirđang được đặt thành một chuỗi con giữa các chỉ số 00( indexOf('/')nằm -1trong C:\Program Files\Notepad\Notepad++.exe), dẫn đến chuỗi trống.

Giải pháp...

Điều này bao gồm mã từ bài đăng sau: Làm cách nào để xác định hệ điều hành hiện tại với Node.js

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

Phát hiện phía máy chủ của hệ điều hành.

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

Phát hiện phía trình duyệt của hệ điều hành

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;

Chức năng trợ giúp để lấy dấu phân tách

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

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

// modifying our getDir method from above...

Chức năng trợ giúp để lấy thư mục mẹ (đa nền tảng)

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() phải đủ thông minh để biết nó đang tìm kiếm cái nào.

Bạn thậm chí có thể thực sự trơn tru và kiểm tra xem người dùng có đang nhập đường dẫn qua dòng lệnh hay không, v.v.

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

Bạn cũng có thể sử dụng mô-đun 'path' và path.sep như đã nêu ở trên, nếu bạn muốn tải mô-đun để thực hiện công việc đơn giản này. Cá nhân tôi nghĩ chỉ cần kiểm tra thông tin từ quy trình đã có sẵn cho bạn là đủ.

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

Và đó là tất cả mọi người!


1
Tôi thích rằng bạn đã trình bày logic để tìm dấu phân tách để sử dụng, chia nó thành các phần có thể quản lý được. Đây là cách một kỹ sư làm việc chuyên nghiệp. +1 cho điều đó. Ngoài ra, xem xét độ tuổi của câu hỏi và việc thiếu NodeJSthẻ - bạn đã trả lời cho cả phía máy chủmáy khách . Câu trả lời của bạn hoàn toàn - và thực sự - trả lời câu hỏi. Đối với nút, tôi nghĩ rằng mô-đun đường dẫn là tốt vì nó sẽ không ảnh hưởng đến hiệu suất bytecode được tạo ra và không ảnh hưởng đến khả năng đọc (một câu lệnh nhập duy nhất). Tuy nhiên, bạn là câu trả lời duy nhất cho phía khách hàng. Điều này nên được chấp nhận.
Rik

1

Như đã được trả lời ở đây, bạn có thể tìm thấy dấu phân tách đường dẫn cụ thể của hệ điều hành path.joinđể tạo đường dẫn của bạn theo cách thủ công. Nhưng bạn cũng có thể để path.joinlàm công việc, đó là giải pháp ưa thích của tôi khi xử lý các cấu trúc đường dẫn:

Thí dụ:

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

Chỉ cần sử dụng "/", nó hoạt động trên tất cả các hệ điều hành theo như tôi biết.


4
OP hỏi làm thế nào để determine, các nhà điều hành làm việc ở khắp mọi nơi :-) không phải những gì
Thép Brain

3
Nó hoạt động khi bạn phải phân tích cú pháp một đường dẫn để trích xuất một thứ gì đó.
Chris Seufert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.