2013-03-05 102 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文件所在的项目目录中。

相关问题