Windows 的路徑中表示文件層級為什麼會用反斜杠 『』,而 UNIX 系統都用斜杠 『/』?

轉義字元不是都用反斜杠么,如果用來當文件路徑的話就要寫成"xxx\xxx"


親們,這真的不是微軟在和 UNIX 鬧彆扭啊。

Windows 用反斜杠(「」)的歷史來自 DOS,而 DOS 的另一個傳統是用斜杠(「/」)表示命令行參數,比如:

cd %SystemDrive%

dir /s /b shell32.dll

既然 DOS 這邊斜杠被佔用了,只好找一個最接近的。那就是它了。而在 UNIX 環境中,我們用減號(「-」)和雙減號(「--」)表示命令行參數。

用斜杠表示命令行參數是兼容性原因。這個問題最初起源自 IBM。IBM 在最初加入 DOS 開發時貢獻了大批工具,它們都是用斜杠處理命令行參數的。而這個傳統源自於 DEC/IBM,比如當年的 VMS 就是用斜杠處理命令行參數,它的目錄分隔符是美元符(「$」)。順便說一句,這個傳統也被部分地繼承進了 DOS 和 Windows 體系,日文版的 Windows 就把反斜杠在屏幕上顯示為「¥」,雖然實際上還是反斜杠。

如今的 Windows 內核在處理路徑時確實可以同時支持斜杠和反斜杠。很多時候我們看到用斜杠時出錯,是因為應用程序層面的原因。比如 cmd.exe 就不支持用斜杠表示路徑,而PowerShell.exe 支持,也正因為這個原因,PowerShell 開始轉而使用減號作為命令行參數的起始符。

MSDN上有一篇 blog 說得很清楚。傳送門:http://blogs.msdn.com/b/larryosterman/archive/2005/06/24/432386.aspx。


Windows使用反斜杠來分割路徑,繼承自DOS,DOS的前身也就是CP/M。DOS 1.0剛出來時,只支持軟盤,並且不支持目錄結構。而這時DOS命令已經使用了正斜杠來作為命令參數的起始符號。後來DOS加入了目錄結構支持,為了不與命令參數符號衝突,使用了反斜杠來作為目錄分隔符。

後來的DOS版本中有加入了一個設置,允許用戶修改命令參數符號,並支持正斜杠作為目錄分隔符。

後來的Windows為了保持向後兼容性,一直都繼承了這個用法。現在的Windows API都同時支持正斜杠和反斜杠。但Windows上的應用程序很多仍只支持反斜杠。


Windows其實是兩種方式都支持的。在寫程序的時候,因為會被當作轉義字元,人們也確實往往喜歡寫成"xxx/xxx"。

我覺得Windows使用反斜杠的原因可能是想和UNIX的文件系統結構做區分吧,比較還是有不一樣的。至於UNIX為什麼用/,大約是因為/符號自古以來就被用來當作分隔符,而且感覺這樣子表示比較形象吧。


《UNIX環境高級編程》前面一個章節中曾經提到過這個,作者當時悠悠的說——不要問為什麼windows用了「」,unix卻用「/」,分明是我們unix創立在先嘛(驕傲的表情)……應該去質疑windows他們為什麼不跟我們保持一致,哼!


推薦閱讀:

在遊戲開發領域,不考慮現有開發人員熟悉程度,函數式編程在設計上或者理論上有它的先天缺陷嗎?
單片機多位元組除法怎麼實現?
為什麼大家都能接受2D橫版遊戲鏡像翻轉後人物左手持武器這種設定?
能不能設計針對確定數對的通用轉換函數?
Passphrase,Passcode,Password 三者之間有什麼區別和聯繫?

TAG:MicrosoftWindows | 編程 | 用戶體驗設計 | Unix |