Tôi đã tự hỏi về sự khác biệt giữa \
và /
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 \
và /
.
Tôi đã tự hỏi về sự khác biệt giữa \
và /
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 \
và /
.
Câu trả lời:
/
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 là 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.DirectorySeparatorChar
trườ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.
Path.Combine
.
foo.exe /bar
có thể được hiểu là một công tắc dòng lệnh, trong khi foo.exe \bar
có thể được hiểu là tham chiếu đến một tệp / thư mục được gọi bar
trong thư mục gốc \
của "ổ đĩa" hiện tại, C:\
ví dụ như.
/
đế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.
/
và ` is not entirely true. For network path you have to use
`(ví dụ: \ <servername> bot không // <servername>)
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.SYS
mụ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 #.
/
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).
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.
\
và /
(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.
/
đã được thêm vào dưới dạng "Alternate_Directory_Separator"
\
là chính xác trong một đường dẫn tệp Windows và /
là chính xác trong một URI.Đây có thể là tài nguyên có liên quan.
\
để /
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".
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 /
và \
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.
` 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.
/
đườ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.
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 Path
lớp học . Điều này chứa một phương thức được gọi là Path.Combine
có 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");
\
đượ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:
/
trong các đường dẫn (ít nhất là 7).
/
URI độc lập như tôi đã nêu trong câu trả lời.