C++獲取當前目錄


獲取當前目錄對於.net來說很簡單,在此不用多說了。C/C++來說挺也簡單,但容易掉進MS的陷阱。在此僅作為筆記記錄一下方法,以便以后備查,高手請路過。

 若是VC MS 封裝了好幾個方法

1、最常用的GetCurrentDirectory,查一下它的原型:

 DWORD GetCurrentDirectory(

  DWORD nBufferLength,  // size, in characters, of directory buffer
  LPTSTR lpBuffer       // pointer to buffer for current directory
);

 

很好理解,兩個參數一個長度,一個目標指針Buffer,如:可以定義一個char path[MAX_PATH],也可以直接用CString path;

 

2、用GetModuleFileName

 如:

 HMODULE module = GetModuleHandle(0); 

CHAR buf[MAX_PATH]; 
GetModuleFileName(module, buf, sizeof buf); 
 

不過以上兩種目錄路徑碰到文件夾帶有“.”就完蛋了,如當前程序放在 D:\\myproject\\test-1.0\\win-app\\目錄下,要想通過GetCurrentDiretory或GetModuleFileName來獲取當前目錄(想要得到:D:\\myproject\\test-1.0\\win-app), 永遠不正確,每次都是:D:\\myproject\\test-1.0 目錄,去掉"1.0"之后,就能正確得到D:\\myproject\\test-1.0\\win-app目錄。我不知道這兩個函數對於這種情況是BUG還是Ms有意為之。

為了這個問題,我折騰了半天的時間,在開發的時候根本不會想那么多,直接用上上面函數來獲取當前程序運行的目錄了,結果也都正確,誰知發布的時候我自作聰明在文件夾名稱加上版本號,結果死得很慘,上線一用永遠得不到正常的結果。。找了半天不知道原因在哪?

最后嘗試去文件的"1.0"字樣結果就正常了。真是悲劇呀。。。

最后,我決定還是用回標准C++的寫法。不相信MS那斯。

其實標准C++的寫法更加簡單,也有庫函數可以調用,_getcwd;

查一下MSDN

char *_getcwd(char *buffer, int maxlen); //ANSI版本
wchar_t *_wgetcwd(wchar_t *buffer, int maxlen ); //Unicode版本

參數說明
buffer:
Storage location for the path.
maxlen:
Maximum length of the path in characters: char for _getcwd and wchar_t for _wgetcwd.
Returns a pointer to buffer.

A NULL return value indicates an error, and errno is set either to ENOMEM,

indicating that there is insufficient memory to allocate maxlen bytes

(when a NULL argument is given as buffer), or to ERANGE, indicating that the path is longer than maxlen characters.

If maxlen is less than or equal to zero, this function invokes an invalid parameter handler, as described in Parameter Validation.


這是MSND上解釋,非常好用。。建議大家用這個_getcwd,而不要用MFC那些神話般的函數。
  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM