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?
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?
Câu trả lời:
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.
Sử dụng path
mô-đun để node.js
trả 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')
path.sep
.
const path = require('path');
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 ' '
và \
được phép.
Đ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);
}
}
targetDir
đang được đặt thành một chuỗi con giữa các chỉ số 0
và 0
( indexOf('/')
nằm -1
trong C:\Program Files\Notepad\Notepad++.exe
), dẫn đến chuỗi trống.
Đ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
NodeJS
thẻ - bạn đã trả lời cho cả phía máy chủ và 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.
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.join
là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
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.
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ì