1. 程式人生 > >c++獲取資料夾路徑(不是檔案哦。。。)及程式當前路徑

c++獲取資料夾路徑(不是檔案哦。。。)及程式當前路徑

         說到檔案路徑,就不得不先說下“/”“\”'\'是右斜槓,也稱反斜槓,一般用來表示轉義,就像“\n”是換行。而我們經常用到的檔案路徑比如"C:\Users\Administrator"(直接得到的路徑,可以從資源管理器上面得到)在程式中用字串表示要寫成“C:\\Users\\Administrator”這裡的"\\"其實就是代表機器中的"\"因為我們用字元來表示他,所以要加一個‘\’進行轉義,就像”換行“是用‘\n’.還有那些不能顯示的ASCII字元等。當然除了上面這種寫法還有一種寫法就是”C:/Users/Administrator“;這邊一定要看清楚了是”/“而不是”\“經常有人會把這個弄錯。”/“是左斜槓,也稱為正斜槓。

也就是說當你在程式中要用字串來表示檔案路徑時,要麼你要用轉義符”\\“要麼用相反的正斜槓”/“來表示系統中的”\“。這樣才能讓系統找到你要找的檔案。

說完檔案路徑,就來說怎麼獲取資料夾路徑吧,在c++中獲取檔案路徑比較簡單,可以直接用檔案對話方塊。如果要獲取資料夾的路徑的話就不一樣了,下面直接上程式碼吧!

BROWSEINFO bi;  
	ZeroMemory(&bi, sizeof(BROWSEINFO));  
	bi.hwndOwner = m_hWnd;  
	bi.ulFlags   = BIF_RETURNONLYFSDIRS;  
	LPITEMIDLIST pidl = SHBrowseForFolder(&bi);  
	BOOL bRet = FALSE;  
	TCHAR szFolder[MAX_PATH*2];  
	szFolder[0] = _T('/0');  
	if (pidl)  
	{  
		if (SHGetPathFromIDList(pidl, szFolder))    
			bRet = TRUE;  
		IMalloc *pMalloc = NULL;  
		if (SUCCEEDED(SHGetMalloc(&pMalloc)) && pMalloc)  
		{   
			pMalloc->Free(pidl);   
			pMalloc->Release();  
		}  
		m_sDataSavePath = szFolder;
		m_sDataSavePath.Replace("\\","/");
	}  

其中最後一句”m_sDataSavePath.Replace("\\","/");“非常重要,就是要對獲得的”\“用”/“替換,這樣不管你把路徑傳給另個變數還是直接儲存到檔案中再讀取這個路徑都能對他直接使用,不然的話很容易出錯!也許你會很奇怪,從機器中獲得的不是”C:\Users\Administrator“,,怎麼是Replace("\\","/")??沒錯,就是用”/“代替”\\“一開始說過,”\“只能用轉義字元”\\“表示,也就是說機器看的這個他就知道用”/“替換”\“,而如果你直接寫Replace("\","/")的話機器是無法識別的,編譯無法通過。所以這邊一定要注意了。

二,檔案路徑的拼接

說到檔案路徑,我們寫程式時可能程序需要將檔案路徑和檔名進行拼接,比如說我要將一張名為“test.jpg”的圖片存放在“C:\Users\Administrator\pic”資料夾中。這時候就要用到拼接了。比如在mfc下(我用的是mfc,其他的沒試過)Cstring img =“test.jpg”,Cstring filePath = “C:\\Users\\Administrator\\pic”.我想通過簡單的字串拼接得到這個檔名:cstring file = filePath+"\\"+img;結果file的值卻是“\test.jpg”,也就是說前面的路徑沒了!!!然後換用filePath.append(img);仍然是出現這種結果;filePath的值為“test.jpg”這顯然不對。所以只好用字元陣列的拼接strcat();上程式碼吧:

CString temStr;
		char tmpc1[255];
		char tmpc2[]="/myData.txt";
		strcpy(tmpc1,m_sDataSavePath);
		strcat(tmpc1,tmpc2);
		temStr.Format("%s",tmpc1);

這樣才把路徑m_sDataSavePath和檔名myData.txt拼接成一個完整的檔名。最後儲存就行了。。

三,程式的當前路徑(即exe檔案的路徑)

CString    CClientApp::ReturnPath()  
   {   
   CString    sPath;   
   GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);   
   sPath.ReleaseBuffer    ();   
   int    nPos;   
   nPos=sPath.ReverseFind('\\');   
   sPath=sPath.Left(nPos);   
   return    sPath;   
   }


水平有限,如有錯誤敬請指出,謝謝!