2013-03-05 93 views
0

我正在運行一個exe文件,它從文件中讀取文件,該文件與exe文件保存在同一個目錄中。 我正在使用_tfopen函數,它返回errno 2,這意味着文件丟失。 正如已經說過的,文本文件與exe文件位於同一個目錄中,所以我只使用文本文件的文件名,而不是整個路徑(即使我嘗試使用絕對文件路徑...)。 我從另一臺計算機運行exe,而不是我正在開發的那個(發行版)。exe在同一個目錄中找不到文本文件

另一個應用程序,使用相同的文件,也在同一目錄中,完美地工作。

爲什麼exe不能找到文本文件?

FILE* fileData; 
if ((fileData = _tfopen(_T("Data.txt"), _T("r"))) == NULL) 
    return false; 
+2

發佈您的代碼。 – 2013-03-05 12:55:42

+0

放置exe文件無關緊要。什麼是當前目錄? – 2013-03-05 12:58:09

+0

在VS2010中,它被設置爲項目目錄,但我在另一臺計算機上運行此exe文件,並且該文本文件位於同一目錄中。 – 2013-03-05 13:02:08

回答

2

你可能想試試這個:有你的程序調用GetCurrentDirectory(),並將結果輸出到某個地方,你可以確認程序的當前目錄是真正的你認爲它是。如果您在調試器下運行,您可以使用OutputDebugString(),否則使用MessageBox()

當我需要確定打開一個共存文件時,我打電話GetModuleFileName(NULL, szExeFqn, sizeof(szExeFqn))獲取EXE文件的FQN,剝離EXE文件名並添加我需要的文件的名稱。這樣,我就不會做任何可能是錯誤的假設 - 畢竟,將快捷方式設置爲與包含EXE文件的目錄不同的程序的默認目錄很簡單。此外,如果通過輸入程序的完整路徑從命令行運行程序,那麼程序的當前目錄就是您在運行它時所在的目錄,而不是找到EXE的目錄。這也是如果你的程序是通過搜索PATH環境變量(是的,它仍然存在於Windows中)找到的。

下面是我用了十多年來做了你所描述的事情的一個例子:

char szHelpFileName[_MAX_FNAME]; 
char *cp; 

GetModuleFileName(NULL, szHelpFileName, sizeof(szHelpFileName)); 
cp = strrchr(szHelpFileName, '\\'); 
if(cp) 
{ 
    cp++; // Point to the char just following the final slash. 
} 
else 
{ // No backslash, is there a colon? 
    cp = strrchr(szHelpFileName, ':'); 
    if(cp) 
    { 
     cp++; // Point to the char just following the colon. 
    } 
    else 
    { // I give up. I'll have no path information. 
     cp = szHelpFileName; 
    } 
} 
strcpy(cp, "program.hlp"); 

最終結果是與EXE位於同一位置的幫助文件的名稱。除非幫助文件丟失(或者其權限已被某種方式掠過),否則這種方式始終有效。我從來沒有遵循評論「我放棄」的「偏執狂」路線。

+0

已經試過這個,得到了相同的結果... – 2013-03-05 13:15:14

+0

當文件存在,並且你的進程/用戶擁有必要的權限時,這個工作是100%的時間。如果你知道這些事實是真的,那麼請張貼代碼,以便我們可以幫助你找到它的錯誤。 – 2013-03-05 13:25:35

1

通常操作系統基於當前目錄打開具有相對地址的文件,而不是可執行位置。所以

例如,如果你的可執行文件是/path/to/exec/executable,你從/path/to/invoke調用它,它會嘗試打開Data.txt,彷彿它是/path/to/invoke/Data.txt

您可以看看this question及其答案,以瞭解如何在Windows中找到可執行文件的路徑。或用於各種其他操作系統的this answer

0

即使沒有指定完整路徑,它也應該工作。你是否從Visual Studio啓動可執行文件?如果是,請確保Data.txt文件位於* .vcxproj文件或* .sln文件所在的項目目錄中。

相關問題