2017-03-13 23 views
0

我已經在64位Windows 7機器上的Visual Studio C++ 2012中編寫了一個非常簡單的程序;它所做的只是使用std :: ifstream打開一個文件並打印其內容。ifstream問題從Windows任務欄執行時

int main() { 

    std::ifstream fileStream("Test.txt"); 

    if (!fileStream.is_open()) { 
     cerr<<"Error: "<<strerror(errno)<<endl; 
    } else { 
     std::string testString; 
     getline(fileStream, testString); 
     cout<<testString<<endl; 
    } 
} 

夠簡單,而且工作得很好。在此代碼正在運行時,任務欄上會出現一個圖標,表示從此代碼生成的可執行文件。如果要右鍵單擊該圖標並運行生成的可執行文件的另一個實例,ifstream將失敗,並指出該文件不存在。當然,它在正常執行時已經正確執行。

如果上述內容不夠奇怪,那麼我試圖將可執行文件固定到任務欄並重復實驗。 它的工作原理是。無論您從任務欄創建多少個實例,它在固定時都能正常工作。

使用完整路徑而不是相對路徑也適用,但我正在開發一個更大的項目,該項目存儲相對於可執行文件的資源;當文件已經存在時,我不想確定可執行文件的路徑。

我確實調用了GetModuleFileName來查找執行路徑,它在所有執行過程中看起來都是一樣的。

所以我的問題是,我錯過了什麼?如果以這種方式運行,爲什麼我無法找到那些字符爲的文件就在我的可執行文件的旁邊?

+3

可能工作目錄是不同的? –

+1

最有可能的工作目錄更改。如果使用絕對文件路徑而不是相對文件路徑會發生什麼? – NathanOliver

+1

'GetModuleFileName'是可執行路徑,與當前工作目錄大致無關。 –

回答

0

您的應用程序如何從任務欄重新啓動可能是一個實現細節,沒有記錄。固定應用程序實際上是存儲在您的配置文件中的快捷方式。如果這打破了你的應用程序,那麼如果用戶使用像.\yourapp\app.exe這樣的路徑手動啓動你的應用程序,它也會中斷!

相對路徑是相對於工作目錄,而不是目錄下的可執行文件位於

新進程的工作目錄可以在許多方面進行設置:

  • 可以從繼承父進程
  • 主叫CreateProcess/ShellExecute
  • 的快捷方式(.LNK)時可以指定一個工作目錄的父進程可以設置一個特定目錄

如果要打開在同一個目錄中的文件作爲.EXE那麼你應該建基於對GetModuleFileName(0)結果(PathRemoveFileSpecPathAppend可以幫助)完整路徑。

如果你永遠不會接受來自命令行的文件名,那麼你可以在打開文件之前手動更改工作目錄。