天天看點

C++ 檔案路徑

http://blog.csdn.net/sszgg2006/article/details/8447176

http://blog.csdn.net/jeanphorn/article/details/44937097

1、絕對路徑表示相對容易

正斜杠,又稱左斜杠,符号是"/";反斜杠,也稱右斜杠,符号是"\"。檔案路徑的表示可以分為絕對路徑和相對路徑:

pDummyFile =fopen("D:\\vctest\\glTexture\\texture\\dummy.bmp", "rb"); 給出了從盤符開始的全部路徑,這裡需要注意的是“\”要用雙斜線"\\",vc工程預設通路的目錄是工程目錄,相對路徑有以下多種形式,如:pDummyFile = fopen("dummy.bmp", "rb"); bmp檔案就在vc工程目錄下,和dsw檔案同屬一個目錄。

pDummyFile = fopen("..\\texture\\dummy.bmp", "rb"); 表示bmp檔案在工程目錄的同級目錄texture中,是以路徑是先退出工程目錄再進入texture目錄通路到bmp檔案。“..”表示退到目前目錄的上一級目錄(父目錄)

    pDummyFile =fopen(".\\texture\\dummy.bmp", "rb"); 表示bmp檔案就在工程目錄的子目錄texture中,“.”表示目前預設目錄,即vc工程目錄,然後在進入其子目錄texture通路到檔案

注意,對相對路徑而言,路徑表示中的“\”也要用雙斜線"\\",

c++中\\是一種轉義字元,他表示一個\,就像\n表示回車一樣。

是以C++中的路徑名:

D:\matcom45\doc\users\_themes\m.dat

應為:

CString filename=_T("D:\\matcom45\\doc\\users\\_themes\\m.dat");或

CStringfilename=_T("D:/matcom45/doc/users/_themes/m.dat");

"./" 加不加都一樣,就是指目前目錄

"../" 表示目前目錄的上級目錄,即目前的父目錄。

2、解析檔案路徑函數: 

 _splitpath函數

在c或者c++程式設計中,常常會用到擷取程式或檔案的路徑,比對路徑做分解和合并處理,_splitpath和_makepath就可以完成這樣的功能。 

  函數的聲明 :

void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext ); 

  功能: 分解路徑,把你的完整路徑給分割開來,就是一個對字元串進行分割的函數。 

參數 描述
path                         Full path(完整路徑)
drove                        Optional drive letter, followed by a colon (:)(磁盤驅動 “:”)
dir                        Optional directory path, including trailing slash.除去盤符和檔案名,中間的那段路徑
fname                        Base filename (no extension)(檔案名)
ext                        Optional filename extension, including leading period (.)(檔案擴充名)

example code:

#include <stdlib.h>
#include <stdio.h>

int main()
{
    char path_buffer[_MAX_PATH] = "D:\\soft\\programming\\vmware.exe";
    char drive[_MAX_DRIVE];
    char dir[_MAX_DIR];
    char fname[_MAX_FNAME];
    char ext[_MAX_EXT];

    _splitpath( path_buffer, drive, dir, fname, ext );

    printf("Drive:%s\n file name: %s\n file type: %s\n",drive,fname,ext);
    strcat(fname,ext);
    printf("File name with extension :%s\n",fname);

    return 0;
}
           

在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編譯器編譯,實際寫入記憶體的字元串并沒有包含反斜杠"\",甚至緊跟在反斜杠後面的字母也一起被轉義成了其它的字元,再次調用的話勢必會出問題。  

字元串解析不僅僅局限于C編譯器,Java編譯器、一些配置檔案的解析、Web伺服器等等,都會遇到對字元串進行解析的這個問題,由于傳統的Windows采用的是單個斜杠的路徑分隔形式,導緻在對檔案路徑進行解析的時候可能發生不必要的錯誤,是以就出現了用雙反斜杠"\\"分隔路徑的形式。不管解析引擎是否将反斜杠解析成轉義字元,最終在記憶體中得到的都是"\",結果也就不會出問題了。 

  由此也可以看出Windows或者說DOS在設計初期考慮不夠周全,為了和Unix一些特征差別開來,将Unix中的正斜杠"/"分隔路徑方式改變成了反斜杠"\"。這樣改變導緻的一個問題就是在早期DOS指令行中,正常的檔案名是不能包含空格的,如果包含了空格,會導緻輸入這樣的檔案名時,指令解析無法将其和參數區分開。例如,想要進入"hutaow yuan"這個目錄(在此先忽略8.3命名規則),直接輸入"cd hutaow yuan",指令行會将其解析為進入"hutaow"目錄,而後面的"yuan"做參數,這顯然不是所期望的。   

而在Unix中,檔案名如果包含空格,可以直接在空格前加上反斜杠"\"進行轉義,進而很好的和指令參數差別出來(參數之間一般使用空格分隔)。還是上面的例子,在Unix中,隻要輸入"cd hutaow\ yuan"(在yuan前面的空格前加上"\"),指令行會正确的辨認出"hutaow yuan"并進入這個目錄。當然,現在Windows的後續版本已經使用其它方法(比如檔案名用雙引号包覆)解決了空格問題。

繼續閱讀