2013-03-05 38 views
2

在包含我的exe的目錄中我有一個名爲「saved」的文件夾。 我想顯示這個目錄包含的文件。用FindFirstFile搜索目錄的相對路徑

我曾經在這裏找到的代碼: Listing directory contents using C and Windows

現在棘手的問題。 如果我使用.\\saves\\作爲我的目錄,它告訴我路徑找不到。 但是,如果我使用..\\release\\saves\\它工作正常。但這很愚蠢。我不想去父文件夾,然後回去。特別是關於我不知道用戶給包含exe的目錄命名(在我的情況下,它是「發佈」,但誰知道用戶做什麼:-D)。

我讀過這個:http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx#fully_qualified_vs._relative_paths但它沒有太大的幫助。

我也試過saves\\.\saves\\但它也不起作用。

我希望有人能告訴我如何解決這個問題。

回答

1

如果它是從可執行文件的路徑而不是從當前工作目錄的路徑相對,則可以使用GetModuleFileName()來獲取可執行文件的完整路徑。然後,從路徑結束可執行文件的名稱,並使用建立的路徑是:

std::string executable_directory_path() 
{ 
    std::vector<char> full_path_exe(MAX_PATH); 

    for (;;) 
    { 
     const DWORD result = GetModuleFileName(NULL, 
               &full_path_exe[0], 
               full_path_exe.size()); 

     if (result == 0) 
     { 
      // Report failure to caller. 
     } 
     else if (full_path_exe.size() == result) 
     { 
      // Buffer too small: increase size. 
      full_path_exe.resize(full_path_exe.size() * 2); 
     } 
     else 
     { 
      // Success. 
      break; 
     } 
    } 

    // Remove executable name. 
    std::string result(full_path_exe.begin(), full_path_exe.end()); 
    std::string::size_type i = result.find_last_of("\\/"); 
    if (std::string::npos != i) result.erase(i); 

    return result; 
} 
+0

這適用於我。謝謝! – 2013-03-05 17:26:38

+0

@Kilian:也許是一個upvote? – 2015-12-21 03:33:40

0

我想你搞錯了使用\\saves\\和忘卻指定搜索參數/串
你應該使用:

saves\\* 

這將搜索任何文件或文件夾

+0

嘿,我通過'sprintf(sPath,「%s \\ *。*」,sDir)添加一個搜索掩碼;'' – 2013-03-05 17:19:37

2

你實際上在代碼中沒有任何錯誤 - 你從Visual Studio啓動項目,它將工作目錄設置爲發佈/調試文件夾的父級。

轉到項目 - >設置(屬性) - >配置屬性 - > Debugging->工作目錄

您也可以運行exe VS的外部和相對路徑會像你期望的那樣。