2012-09-03 36 views
0

以下answer使用C#提供了一個解決方案的當前目錄下,我在想,如果一個人只用c中的等價會是什麼++(不是C + + \ CLI)設置在C運行的應用程序++

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 

是有什麼可以做的伎倆提升?

基於這個問題,我一直有:Correctly creating and running a win32 service with file I/O

+0

你想爲此C運行時API?或爲此的Windows API? CRT = _chdir(),WinAPI = SetCurrentDirectory()。 – WhozCraig

+1

@CraigNelson:我認爲eq-的答案很好。我現在需要的是System.AppDomain.CurrentDomain.BaseDirectory –

+0

我同意(並且相應地反駁了他的反饋)。 – WhozCraig

回答

8

SetCurrentDirectory(在WIN32):

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365530%28v=vs.85%29.aspx

current_pathboost::filesystem

http://www.boost.org/doc/libs/1_51_0/libs/filesystem/doc/reference.html#current_path

的等價物BaseDirectory可能是GetModuleFileName(第一個參數的句柄爲空),然後是GetFullPathName以從可執行路徑獲取目錄。

+1

偉大的答案!但是對於「System.AppDomain.CurrentDomain.BaseDirectory」調用是否有相同的權限?我相信這是正在運行的exe文件的路徑 –

+0

就像一個額外的POSIX API:'#include chdir(const char *)',它可以在Linux,Mac,BSD上工作......我聽說Windows也是實現一些POSIX調用。一些WinApi專家可以說些什麼嗎? –

+0

@AndréOriani: - 有人指出....請參閱我的答案中的鏈接.. – perilbrain

4

在Windows的

System.IO.Directory.SetCurrentDirectory (System.AppDomain.CurrentDomain.BaseDirectory)` 

完全等效的是:

// Get full executable path 
char buffer[MAX_PATH]; 
GetModuleFileName(NULL, buffer, MAX_PATH); 

// Get executable directory 
boost::filesystem::path path(buffer); 
path = path.parent_path(); 

// Set current path to that directory 
boost::filesystem::current_path(path); 

請注意,沒有與平臺無關的方式來獲取應用程序的目錄,因爲C++不能識別標準中目錄的概念。 Boost似乎也沒有相同的功能。

相關問題