2016-04-03 70 views
-2

我正在經歷學習C++的過程,所以我正在製作一些程序/工具來在計算機上執行某些簡單的操作。在這個例子中,我創建了一個程序來定位計算機上的瀏覽器(它將用於清除瀏覽器cookie等)。有可能更高級的方式更有效地做到這一點,但我現在試圖儘可能簡單。到目前爲止,我試圖找出目錄「C:\ Program Files(x86)\ Google \ Chrome」是否存在。我通過使用getenv ("Program Files (x86)"獲得程序文件目錄的地址,但是如何在添加地址的其餘部分之後? 因爲變量是const char *(bool PathIsDirectory()需要const char *作爲參數),所以我不能使用+運算符進行連接。Const char concatenation和getenv()

std::cout << "Searching for browsers..." << std::endl; 
const char *chromePath; 
chromePath = getenv ("ProgramFiles(x86)"); 

bool result = PathIsDirectory(chromePath); 

if(result == true) 
{ 
    std::cout << "-- Google Chrome - FOUND" << std::endl; 
} 
else 
{ 
    std::cout << "-- Google Chrome - NOT FOUND" << std::endl; 
} 
+0

你真的可以通過'getenv'獲得'ProgramFiles'的路徑嗎? 'getenv'用於檢索環境變量。 – ForceBru

+0

@ForceBru據此耶:http://stackoverflow.com/questions/9594066/how-to-get-program-files-x86-env-variable – vu1p3n0x

+0

我懷疑'ProgramFiles(x86)'表示一個有效的環境變量。 –

回答

3

可以的getenv()結果存儲在一個std::string對象(如在 評論中提到)。然後你可以添加使用+運算符這樣的路徑的其餘部分:

#include <string> 
//... 
std::string chromePath = getenv ("ProgramFiles(x86)"); 
chromePath += "\\remaining\\path"; 
bool result = PathIsDirectory(chromePath.c_str()); 

請注意,你必須躲避反斜線,如上圖所示。

+0

問題是在PathIsDirectory()中不允許使用字符串變量,只有const char *作爲參數。然而,我可以爲google chrome目錄的其餘路徑創建一個新的const char *變量,然後使用strcat(const char *變量1,const char *變量2)並將它們存儲在最終的「完整路徑」中char *變量,在PathIsDirectory()中有效。看到我上面的答案。 – saltcracker

+1

正如@petesh在問題評論中所說的,你可以使用'yourstring.c_str()'從'std :: string'中得到'const char *'。當你調用未定義的行爲時,你的自己的答案不是一個安全的方法。請考慮使用'std :: string'。 – vu1p3n0x

+0

vu1p3n0x是對的。我相應地更新了我的答案。看看http://en.cppreference.com/w/cpp/string/byte/strcat。你會看到strcat實際上寫入了由getenv()的返回值指向的內存。這是錯誤的,因爲你不會記住那個記憶。 – tonisuter