Sự khác biệt giữa dấu gạch chéo (/) và dấu gạch chéo ngược (\) trong đường dẫn tệp


153

Tôi đã tự hỏi về sự khác biệt giữa \/trong đường dẫn tập tin. Tôi đã nhận thấy rằng đôi khi một con đường chứa/ và đôi khi nó là với \.

Sẽ thật tuyệt nếu ai đó có thể giải thích khi nào nên sử dụng \/.


4
Sự khác biệt trong bối cảnh nào? Một bối cảnh webby? Thoát trong chuỗi C #? Nó được gắn thẻ với ASP.NET.
Peter Mortensen


6
@Peter Tôi sẽ đóng cái cũ hơn làm bản sao của cái này, vì cái này có câu trả lời tốt hơn.
nicael

6
Làm thế nào là c #asp.net liên quan đến câu hỏi?
Oriol

2
@zzzzBov tại sao cái này không chỉ đơn giản là chuyển hướng đến cái cũ hơn và câu trả lời tốt hơn được đặt ở đó? Tôi không thích một hệ thống mà một câu hỏi tôi hỏi có thể được đóng lại trong tương lai xa như là một "bản sao" của một cái gì đó đã xảy ra sau này. Ít nhất gọi nó là một cái gì đó mô tả hơn, như "thay thế" hơn là trùng lặp. "Một" ban đầu không thể là một bản sao của bất cứ điều gì, nó là duy nhất.

Câu trả lời:


248

/là dấu phân cách đường dẫn trên các hệ thống giống Unix và Unix. Windows hiện đại thường có thể sử dụng cả hai \và có thể /thay thế cho các filepath, nhưng Microsoft đã ủng hộ việc sử dụng\ làm dấu phân cách đường dẫn trong nhiều thập kỷ.

Điều này được thực hiện vì những lý do lịch sử có từ những năm 1970, trước Windows hơn một thập kỷ. Ban đầu, MS-DOS (nền tảng của Windows đầu tiên) không hỗ trợ các thư mục. Unix đã hỗ trợ thư mục bằng cách sử dụng /ký tự từ đầu. Tuy nhiên, khi các thư mục được thêm vào trong MS-DOS 2.0, Microsoft và IBM đã sử dụng /ký tự cho các chuyển đổi lệnh và do trình phân tích cú pháp nhẹ của DOS (xuất phát từ QĐOS , được thiết kế để chạy trên phần cứng cấp thấp hơn), họ không thể tìm thấy cách khả thi để sử dụng /ký tự mà không phá vỡ tính tương thích với các ứng dụng hiện có của họ.

Vì vậy, để tránh các lỗi về "thiếu công tắc" hoặc "công tắc không hợp lệ" khi truyền các filepath làm đối số cho các lệnh như sau:

cd/                        <---- no switch specified
dir folder1/folder2        <---- /folder2 is not a switch for dir

người ta đã quyết định rằng \nhân vật sẽ được sử dụng thay thế, vì vậy bạn có thể viết những lệnh như thế này

cd\
dir folder1\folder2

không có lỗi.

Sau đó, Microsoft và IBM đã hợp tác trên một hệ điều hành không liên quan đến DOS có tên OS / 2 . OS / 2 có khả năng sử dụng cả hai dải phân cách, có thể để thu hút nhiều nhà phát triển Unix hơn. Khi Microsoft và IBM chia tay nhau vào năm 1990 , Microsoft đã lấy mã họ có và tạo ra Windows NT , dựa trên tất cả các phiên bản hiện đại của Windows, mang theo thuyết bất khả tri phân tách này.


Vì khả năng tương thích ngược là tên của trò chơi dành cho Microsoft trong tất cả các lần chuyển đổi hệ điều hành lớn mà họ đã thực hiện (DOS sang Win16 / DOS, sang Win16 / Win32, Win32 / WinNT), nên điều này có thể sẽ bị mắc kẹt tồn tại trong một thời gian.

Vì lý do này mà sự khác biệt này tồn tại. Nó thực sự không có tác dụng gì với những gì bạn đang làm bởi vì, như tôi đã nói, WinAPI thường có thể sử dụng chúng thay thế cho nhau. Tuy nhiên, các ứng dụng của bên thứ 3 có thể sẽ bị hỏng nếu bạn vượt qua /khi họ mong đợi \giữa các tên thư mục. Nếu bạn đang sử dụng Windows, hãy kiên trì \. Nếu bạn đang sử dụng Unix hoặc URI (có nền tảng của chúng trong các đường dẫn Unix, nhưng đó hoàn toàn là một câu chuyện khác), thì hãy sử dụng /.


Trong ngữ cảnh của C #: Cần lưu ý, vì về mặt kỹ thuật đây câu hỏi về C #, rằng nếu bạn muốn viết mã C # "di động" hơn, hoạt động trên cả Unix và Windows (ngay cả khi C # chủ yếu là ngôn ngữ Windows), bạn có thể muốn sử dụng Path.DirectorySeparatorChartrường để mã của bạn sử dụng dấu tách ưa thích trên hệ thống đó và sử dụng Path.Combine()để nối các đường dẫn đúng cách.


57
Và luôn luôn kết hợp các đường dẫn sử dụng Path.Combine.
Cheng Chen

1
Hấp dẫn. Vì vậy, trong DOS hoặc Windows, foo.exe /barcó thể được hiểu là một công tắc dòng lệnh, trong khi foo.exe \barcó thể được hiểu là tham chiếu đến một tệp / thư mục được gọi bartrong thư mục gốc \của "ổ đĩa" hiện tại, C:\ví dụ như.
Jeppe Stig Nielsen

4
Cần lưu ý rằng việc chuẩn hóa này từ /đến \ được thực hiện trong lớp compat Win32, có nghĩa là nếu bạn phá vỡ nó, sẽ có một sự khác biệt. Ví dụ nổi tiếng nhất về điều này là các đường dẫn có độ dài mở rộng: \\?\C:\ sẽ hoạt động như mong đợi trên NTFS nhưng \\?\C:/sẽ không.
Voo

4
@PC Luddite: WinAPI đó có thể xử lý cả hai /` is not entirely true. For network path you have to use `(ví dụ: \ <servername> bot không // <servername>)
raznagul

2
@raznagul Đúng. Tôi đã không thực sự đề cập đến các đường dẫn mạng trong câu trả lời của tôi. Tôi mắc kẹt chủ yếu với các loại filepath phổ biến. Tôi sẽ thêm nó.
PC Luddite

20

MS-DOS 1.0 giữ lại quy ước ký tự (hoặc chuyển đổi) ký tự của '/' từ CP / M. Tại thời điểm đó không có cấu trúc thư mục trong hệ thống tập tin và không có xung đột.

Khi Microsoft phát triển môi trường giống Unix hơn với MS-DOS (và PC-DOS) 2.0, họ cần đại diện cho trình phân tách đường dẫn bằng cách sử dụng thứ gì đó không xung đột với các tùy chọn dòng lệnh hiện có. Trong nội bộ, hệ thống hoạt động tốt như nhau với '/' hoặc '\'. Bộ xử lý lệnh (và nhiều ứng dụng) tiếp tục sử dụng '/' làm ký tự chuyển đổi.

Một CONFIG.SYSmục SWITCHAR=-có thể được sử dụng để ghi đè /mặc định để cải thiện khả năng tương thích Unix. Điều này làm cho các lệnh được xây dựng và các tiện ích tiêu chuẩn sử dụng ký tự thay thế. Dấu tách đường dẫn Unix sau đó có thể được sử dụng rõ ràng cho tên tệp và thư mục. Mục nhập này đã bị xóa trong các phiên bản sau, nhưng một cuộc gọi DOS đã được ghi lại để đặt giá trị sau khi khởi động.

Điều này ít được sử dụng và hầu hết các công cụ của bên thứ ba vẫn không thay đổi. Sự nhầm lẫn vẫn còn. Nhiều cổng của các công cụ Unix giữ lại ký tự chuyển đổi '-' trong khi một số hỗ trợ cả hai quy ước.

Bộ xử lý lệnh PowerShell tiếp theo thực hiện các tham số thoát và chuyển đổi nghiêm ngặt và phần lớn tránh sự nhầm lẫn trừ khi sử dụng các công cụ kế thừa.

Cả câu hỏi và câu trả lời đều không liên quan đến C #.


2
Như một ghi chú lịch sử, việc sử dụng /làm phần giới thiệu tùy chọn trong nhiều hệ điều hành PDP-11 khác nhau như RSTS (1970) và RSX (1972) có trước CP / M (1973).
PJTraill

9

Trên các hệ thống dựa trên Unix \là một ký tự thoát, nghĩa là, \nói với trình phân tích cú pháp rằng đây là khoảng trắng và không phải là kết thúc của câu lệnh. Trên các hệ thống Unix /là trình phân tách thư mục.

Trên Windows \là dấu phân cách thư mục, nhưng /không thể được sử dụng trong tên tệp hoặc thư mục.


1
\ /(cũng như một số biểu tượng khác) không thể được sử dụng trong tên tệp vì DOS không có cùng trình phân tích cú pháp phức tạp mà người dùng Unix đã quá quen thuộc. Việc thiếu một trình phân tích cú pháp tốt là kết quả của việc MS-DOS bị hạ xuống từ QĐOS ("Hệ điều hành nhanh và bẩn"). Nó có nghĩa là để mọi thứ chạy nhanh và trên phần cứng hạn chế. Tất cả điều này tất nhiên vẫn tồn tại trong thời đại ngày nay để tương thích ngược.
PC Luddite

2
tốt, đáng nói là trong các phiên bản Windows sau này, nó /đã được thêm vào dưới dạng "Alternate_Directory_Separator"
Tomer W

@PCLuddite có lẽ chúng ta nên nghĩ đến khả năng tương thích về phía trước?

1
@nocomprende Điều gì về filepaths là không thể? Không phù hợp với những gì? Và như tôi đã nói trước đây, việc lưu "một vài ứng dụng DOS" (thực sự giống như hàng ngàn) khỏi bị phá vỡ là điều thực sự quan trọng đối với người tiêu dùng vào thời điểm đó. Đó là những gì làm cho Microsoft thành công ngày hôm nay và Unix (và tất cả những người khác thực sự) bắt đầu từ sự suy giảm (ngay cả khi đã có sự hồi sinh trong thập kỷ qua). Tôi không thấy làm thế nào mà không nhìn nó với lẽ thường.
PC Luddite

1
@nocomprende Và lập luận của bạn về filepaths không được chuẩn hóa là hoàn toàn vô hiệu. Chúng được chuẩn hóa trên Windows và chúng được chuẩn hóa trên Unix. Nếu bạn đang nói về một tiêu chuẩn đa nền tảng, điều đó không thực sự hữu ích hoặc dễ thực hiện. Ai sẽ nói rằng một tiêu chuẩn thực sự "tốt hơn" tiêu chuẩn khác?
PC Luddite

8
  • Một URL, được chuẩn hóa trong RFC 1738, luôn sử dụng dấu gạch chéo về phía trước, bất kể nền tảng.
  • Đường dẫn tệp và URI là khác nhau. \là chính xác trong một đường dẫn tệp Windows và /là chính xác trong một URI.
  • Một số trình duyệt (cụ thể là Firefox & Opera) thất bại thảm hại khi gặp URI với dấu gạch chéo ngược.
  • System.IO.Path.DirectorySeparatorChar để lấy dấu phân cách đường dẫn hiện tại

Đây có thể là tài nguyên có liên quan.


10
Thất bại thảm hại? Firefox dịch \​​để /tự động. Trong cuốn sách của tôi, điều này được gọi là "hoạt động liền mạch".
Kroltan

22
Ngôi nhà của tôi bốc cháy lần cuối cùng tôi sử dụng \ trong Firefox
user3163495

1
@CarstenS, Firefox không chuyển đổi dấu gạch chéo ngược để chuyển tiếp dấu gạch chéo trong tự động hóa URL và không mở liên kết. Tiện ích bổ sung này sửa URL với dấu gạch chéo ngược và trang mở. addons.mozilla.org/en-US/seamonkey/addon/ từ
Sami

Chính xác thì bạn có ý gì khi "thất bại thảm hại"? Chuyện gì xảy ra Trình duyệt có bị sập và thoát không?
Peter Mortensen

7

Ngoài các câu trả lời được đưa ra, điều đáng nói \là được sử dụng rộng rãi cho các ký tự đặc biệt (như \n \t) trong ngôn ngữ lập trình, trình soạn thảo văn bản và các hệ thống chung áp dụng phân tích từ vựng.

Nếu bạn đang lập trình chẳng hạn, đôi khi thật bất tiện khi cần phải thoát dấu gạch chéo ngược với một cái khác ( \\) để sử dụng đúng cách - hoặc cần sử dụng chuỗi thoát, chẳng hạn như C #@"\test" .

Tất nhiên, như đã đề cập trước đó, các URI web sử dụng dấu gạch chéo theo tiêu chuẩn nhưng cả hai dấu gạch chéo đều hoạt động trong các công cụ dòng lệnh mới nhất và phổ biến nhất.

CẬP NHẬT: Sau khi tìm kiếm một chút, có vẻ như toàn bộ câu chuyện giữa /\quay trở lại trong "lịch sử máy tính", trong thời đại của DOS và các hệ thống dựa trên Unix tại thời điểm đó. HowToGeek có một bài viết thú vị về câu chuyện này.

Nói một cách ngắn gọn, DOS 1.0 ban đầu được IBM phát hành mà không có hỗ trợ thư mục và /được sử dụng cho chức năng lệnh ("chuyển đổi") khác. Khi các thư mục được giới thiệu ở phiên bản 2.0, /đã được sử dụng, do đó IBM đã chọn biểu tượng gần nhất là trực quan \. Mặt khác, Unix được sử dụng tiêu chuẩn /cho các thư mục.

Khi người dùng bắt đầu sử dụng nhiều hệ thống khác nhau, họ bắt đầu bối rối, khiến các nhà phát triển hệ điều hành cố gắng làm cho hệ thống hoạt động trong cả hai trường hợp - điều này thậm chí áp dụng trong một phần của URL, vì một số trình duyệt hỗ trợ http: \\ www.test. com \ đi định dạng. Điều này có những hạn chế mặc dù nói chung, nhưng toàn bộ vấn đề ngày nay vẫn là nguyên nhân khả năng tương thích ngược, với nỗ lực hỗ trợ cả hai dấu gạch chéo trên Windows, mặc dù chúng không còn dựa trên DOS nữa.


"cả hai dấu gạch chéo hoạt động trong đường dẫn hệ thống tệp." là không chính xác, bởi vì Unix khá tức giận khi bạn sử dụng ` as well as many make` shell ... bạn đúng là Windows gần đây đã xác định biến môi trường ALTERNATE_PATH_SEPARATOR mặc định /do đó Windows có thể chấp nhận cả hai.
Tomer W

1
@TomerW Windows NT luôn tương thích với POSIX (mặc dù POSIX ban đầu dù sao cũng là một mớ hỗn độn và một số phần bị mắc kẹt trong Windows để tương thích ngược). Điều đó bao gồm các /đường dẫn hỗ trợ ở mọi nơi trong hệ thống - tất nhiên, các ứng dụng có thể hiểu sai các đường dẫn đó khi rảnh rỗi, vì vậy nó không được sử dụng quá nhiều. Các ứng dụng không phải CLI đã không cố gắng thực hiện xác thực (bị hỏng) các đường dẫn của chính chúng hoạt động tốt ngay từ đầu.
Luaan

@Luaan Windows có khả năng hỗ trợ nhiều tính năng POSIX, nhưng tôi khó có thể nói đó là "tương thích POSIX". Chắc chắn, có một vài hệ thống con POSIX có thể sử dụng trong nhiều năm, nhưng chúng không còn lý tưởng. Windows 10 sẽ hỗ trợ Ubuntu bash mặc dù vào cuối mùa hè này cùng với hỗ trợ riêng cho các công cụ Linux đi kèm với Ubuntu, vì vậy bạn có thể lập luận rằng trong tương lai, nhưng bạn chắc chắn không thể nói "luôn luôn".
PC Luddite

@Luaan Trừ khi "tương thích", bạn có nghĩa là "cygwin hoạt động".
PC Luddite

@PCLuddite Không, nó tương thích 100% POSIX.1c. Điều đó không có nghĩa là tất cả các ứng dụng unix hoạt động trên nó - hầu hết các ứng dụng unix không tuân thủ POSIX :)
Luaan

6

Bạn không nên sử dụng hoặc trong C #. Bạn nên luôn luôn sử dụng các Pathlớp học . Điều này chứa một phương thức được gọi là Path.Combinecó thể được sử dụng để tạo các đường dẫn mà không chỉ định dấu phân cách.

Ví dụ sử dụng:

string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");

5

\ được sử dụng cho đường dẫn tệp cục bộ của Windows và đường dẫn mạng như trong:

C:\Windows\Temp\ hoặc là \\NetworkSharedDisk\Documents\Archive\

/ là những gì được yêu cầu bởi các URI tiêu chuẩn như trong:

http://www.stackoverflow.com/


2
@NikhilVartak, tôi đã thêm các ví dụ mặc dù tôi nghĩ rằng câu trả lời ban đầu của tôi đã giải quyết tất cả các câu hỏi của OP.
Tro

3
Windows cũng nhận ra /trong các đường dẫn (ít nhất là 7).
Kenneth K.

Câu trả lời này là không đầy đủ.
Revierpost

Bạn có ý định liên kết đến một số tài nguyên, ngoài trang chính Stack Overflow không?
TAS

@reinierpost, câu trả lời của tôi dựa trên câu hỏi của OP và các thẻ liên quan. Giống như một vài câu trả lời khác ở đây, tôi có thể sao chép thứ gì đó từ stackoverflow.com/questions/1589930/ và dán nó ở đây nhưng có vẻ quá mức. @tas, tôi dự định liên kết đến trang stackoverflow hoặc bất kỳ siêu liên kết trang web nào để minh họa việc sử dụng các /URI độc lập như tôi đã nêu trong câu trả lời.
Tro
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.