1. 程式人生 > >絕對路徑以及相對路徑中的斜杠和反斜杠

絕對路徑以及相對路徑中的斜杠和反斜杠

輸出字符串 很好 htm 內存 pillow body 網絡 settings users

一、C++文件中的路徑

文件路徑中的正斜杠和反斜杠

正斜杠,又稱左斜杠,符號是"/";

反斜杠,也稱右斜杠,符號是"\"。

文件路徑的表示可以分為絕對路徑和相對路徑:

1、 絕對路徑

絕對路徑表示相對容易,

例如要打開“C: \Documents andSettings\All Users\My Documents\Downloads\pillow.jpg”,則:

Fp =fopen("C: \\Documents andSettings\\All Users\\My Documents\\Downloads

\\pillow.jpg ", "rb");

給出了從盤符開始的全部路徑,這裏需要註意的是“\”要用雙斜線"\\",因為路徑包含在雙引號中,相當於一個字符串,字符串中的反斜杠需要和一個反斜杠連用,表示一個轉義字符。

2、相對路徑

vc工程默認訪問的目錄是工程目錄,相對路徑有以下多種形式,

當前工作路徑(DSW所在目錄)

文件的絕對路徑

相對路徑的寫法

D: \VS2008\test\test.dsw

D: \VS2008\test\ pillow.jpg

Fp =fopen ("pillow.jpg ", "rb");

D: \VS2008\test\test.dsw

D: \VS2008\test\src\ pillow.jpg

Fp =fopen (".\\src\\pillow.jpg", "rb");

或者Fp =fopen ("src\\pillow.jpg", "rb");

D: \VS2008\test\test.dsw

D: \VS2008\src\ pillow.jpg

Fp =fopen ("..\\src\\pillow.jpg", "rb");

例一:

Fp =fopen ("pillow.jpg ","rb"); bmp文件就在vc工程目錄下,和dsw文件同屬一個目錄。

例二:

Fp =fopen ("..\\src\\pillow.jpg", "rb");

"../" 表示當前目錄的上級目錄,即當前的父目錄。表示JPG文件在工程目錄的同級目錄src中,因此路徑是先退出工程目錄再進入src目錄訪問到JPG文件。“..”表示退到當前目錄的上一級目錄(父目錄)

例三:

Fp =fopen(".\\Downloads\\pillow.jpg", "rb");

".\" 加不加都一樣,就是指當前目錄。 表示JPG文件就在工程目錄的子目錄src中,“.”表示當前默認目錄,即vc工程目錄,然後在進入其子目錄src訪問到文件

二、HTML文件中的路徑表示

HTML中的相對路徑:

“../”表示上一級目錄開始

“./”表示當前同級目錄開始

“/”表示根目錄開始。

當前HTML絕對路徑

需要鏈接到的HTML絕對路徑

鏈接路徑

D:\workspace\TEST_HTML\main.htm

D:\workspace\test \link.html

"../test/link.htm"

D:\workspace\TEST_HTML\main.htm

D:\workspace\TEST_HTML\test\link.html

"./test/link.htm"

D:\workspace\TEST_HTML\main.htm

D: \test\link.html

"/test/link.htm"

三、Unix/Linux環境下的路徑表示

在Unix/Linux中,路徑的分隔采用正斜杠“/”,比如"/home/hutaow";而在Windows中,路徑分隔采用反斜杠“\”,比如“C:\Windows\System”。

四、路徑總結

有時我們會看到這樣的路徑寫法,“C:\\Windows\\System”,也就是用兩個反斜杠來分隔路徑,這種寫法在網絡應用或編程中經常看到。事實上,上面這個路徑可以用“C:/Windows/System”來代替,不會出錯。但是如果寫成了“C:\Windows\System”,那就可能會出現各種奇怪的錯誤了。這是因為,在C裏面,輸出字符串時,反斜杠(“\”)這個符號會把跟在它後面的字符結合起來轉義成其它字符。

例如:如果想輸出一個換行,那就要加上“\n”這個標誌;輸出一個TAB,就加上“\t”;想輸出雙引號(‘"‘),就需要輸入“\"”。那麽如果想輸入一個反斜杠呢?很簡單,只要敲“\\”就可以了。

  看到這裏就會明白,如果“C:\Windows\System”這個路徑字符串交給C編譯器編譯,實際寫入內存的字符串並沒有包含反斜杠“\”,而是將“\W”,“ \S”一起被轉義成了其它的字符,再次調用的話勢必會出問題。

字符串解析不僅僅局限於C編譯器,Java編譯器、一些配置文件的解析、Web服務器等等,都會遇到對字符串進行解析的這個問題。由於傳統的Windows采用的是單個斜杠的路徑分隔形式,導致在對文件路徑進行解析的時候可能發生不必要的錯誤,所以就出現了用雙反斜杠“\\”分隔路徑的形式。不管解析引擎是否將反斜杠解析成轉義字符,最終在內存中得到的都是“\”,結果也就不會出問題了。

  由此也可以看出Windows或者說DOS在設計初期考慮不夠周全,為了和Unix一些特征區別開來,將Unix中的正斜杠"/"分隔路徑方式改變成了反斜杠“\”。這樣改變導致的一個問題就是在早期DOS命令行中,正常的文件名是不能包含空格的。看下面一個例子:

例如,想要進入“hutaowyuan”這個目錄(在此先忽略8.3命名規則),

直接輸入“cdhutaow yuan”,命令行會將其解析為進入“hutaow”目錄,而後面的“yuan”做參數,這顯然不是所期望的。   

在Unix中,文件名如果包含空格,可以直接在空格前加上反斜杠“\”進行轉義,從而很好的和命令參數區別出來(參數之間一般使用空格分隔)。還是上面的例子,在Unix中,只要輸入“cdhutaow\ yuan”(在yuan前面的空格前加上“\”),命令行會正確的辨認出“hutaow yuan”並進入這個目錄。

而在早期DOS命令行中,如果包含了空格,會導致輸入這樣的文件名時,命令解析無法將其和參數區分開。如果輸入反斜杠,則表示“hutaow\ yuan”這個路徑。當然,現在Windows的後續版本已經使用其它方法(比如文件名用雙引號括住)解決了空格問題。

絕對路徑以及相對路徑中的斜杠和反斜杠