2012-03-18 31 views
108

vì mọi người đều biết Windows thực hiện đường dẫn với dấu gạch chéo ngược, trong đó unix có đường dẫn với dấu gạch chéo về phía trước. Node.js cung cấp path.join() để luôn sử dụng dấu gạch chéo đúng. Vì vậy, ví dụ thay vì chỉ viết unix 'a/b/c', bạn sẽ làm path.join('a','b','c') để thay thế.Bạn có cần sử dụng path.join trong Node.js không?

Tuy nhiên, có vẻ như rằng mặc dù sự khác biệt này nếu bạn không bình thường hóa đường dẫn của bạn (ví dụ sử dụng path.join) và chỉ viết những con đường như a/b/c Node.js không có vấn đề với chạy kịch bản của bạn trên cửa sổ ...

Vì vậy, có bất kỳ lợi ích nào khi viết path.join('a','b','c') qua 'a/b/c' không? vì cả hai dường như hoạt động bất kể nền tảng ...

Trả lời

90

hệ thống tập tin của Windows không có vấn đề bằng cách sử dụng phía trước hoặc phía sau dấu gạch chéo như dải phân cách đường (điều này đã được các trường hợp kể từ khi trở lại trong những ngày DOS). Vấn đề thực sự duy nhất là các bộ xử lý dòng lệnh của Windows (hoặc, cụ thể hơn, các tiện ích dòng lệnh của Windows) có xu hướng giải thích các dấu gạch chéo ở phía trước như các bộ định danh tùy chọn thay vì các thành phần đường dẫn. Vì vậy, bạn cần một đường dẫn ngược nếu bạn cần phải vượt qua một đường dẫn đến một lệnh Windows chạy như một tiến trình con. Ngoài ra, các cuộc gọi Windows API (và các phương thức từ các ngôn ngữ cấp cao hơn gọi Windows API) mà các đường dẫn trả về sẽ sử dụng các dấu gạch chéo ngược, vì vậy ngay cả khi bạn không chuyển chúng sang các tiến trình con, bạn sẽ cần phải chuẩn hóa chúng.

+0

Chuyển tiếp dấu gạch chéo cũng phá vỡ đường dẫn UNC. – user2426679

40

Tôi sử dụng paths.join để đảm bảo dấu phân tách thư mục ở đúng vị trí, không nhất thiết phải đảm bảo rằng nó sử dụng dấu gạch chéo ngược lại. Ví dụ:

path.join("/var/www", "test") 

sẽ chèn một cách chính xác các dấu phân cách giữa www và thử nghiệm /var/www/test

+1

Tôi không hiểu điểm này.Nếu bạn có các tập lệnh đó trong các biến, tại sao không chỉ thêm dấu gạch chéo theo cách thủ công? – mgol

+1

Tôi cũng gặp khó khăn khi hiểu câu trả lời này. Không thể thấy bất kỳ giá trị nào. – oligofren

+17

Bởi vì tôi không luôn luôn chắc chắn liệu các giá trị đường dẫn tôi nhận được từ các nguồn khác sẽ có dấu gạch chéo hay không. Ví dụ của tôi ở trên đã được contrived. Thường thì những đường dẫn đó không được mã hóa cứng, nhưng đang được kéo từ các tệp cấu hình khác, đầu vào của người dùng, thư viện, v.v. –

27

Câu trả lời ngắn:

Tất cả fs.* chức năng (. Ví dụ fs.open, vv) xử lý các tên đường dẫn cho bạn. Vì vậy, bạn không cần phải tự mình sử dụng path.join và làm cho mã của bạn không đọc được.

Long trả lời:

Tất cả fs.* chức năng gọi path._makeLong(path), mà lần lượt gọi path.resolve(path), trong đó có regexps đặc biệt dành cho Windows, trong đó sẽ đưa vào tài khoản xuyệc ngược \ hoặc dấu gạch chéo /. Bạn có thể kiểm tra xem nó ra cho chính mình tìm mã nguồn của họ tại địa chỉ:

73

path.join sẽ chăm sóc delimiters không cần thiết, có thể xảy ra nếu pathes cho đến từ các nguồn không xác định (ví dụ: đầu vào của người dùng, API của bên thứ ba, v.v.).

Vì vậy, path.join('a/','b')path.join('a/','/b'), path.join('a','b')path.join('a','/b') tất cả sẽ cung cấp cho a/b.

Nếu không sử dụng nó, bạn thường sẽ kỳ vọng về sự bắt đầu và kết thúc của các con đường tham gia, biết rằng họ chỉ không có hoặc một dấu gạch chéo.

Các vấn đề liên quan