【问题标题】:exe does not find a text file in the same directoryexe在同一目录中找不到文本文件
【发布时间】:2013-03-05 12:54:34
【问题描述】:

我正在运行一个从文件中读取文本的 exe,该文件与 exe 保存在同一目录中。 我正在使用 _tfopen 函数,它返回 errno 2,这意味着文件丢失。 如前所述,文本文件与 exe 位于同一目录中,因此我仅使用文本文件的文件名而不是整个路径(即使我尝试使用绝对文件路径......)。 我在另一台计算机上运行 exe,而不是我正在开发的计算机(发行版)。

另一个使用相同文件的应用程序,也在同一目录中,运行良好。

为什么exe找不到文本文件?

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

【问题讨论】:

  • exe放在哪里都没有关系。当前目录是什么?
  • 在VS2010中设置为项目目录,但是我在另一台电脑上运行这个exe,文本文件在同一目录下。
  • 希望你的程序不调用chdir,它会改变进程的工作目录。除了给出exe的完整路径,你能不能给出要打开的文件的完整路径,它会清楚你的程序是否调用chdir。

标签: c++ text mfc release exe


【解决方案1】:

您可能想试试这个:让您的程序调用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 位于同一位置的帮助文件的名称。除非帮助文件丢失(或者它的权限被某种方式控制了),否则这总是有效的。我从来没有让它遵循评论说“我放弃”的“偏执狂”路径。

【讨论】:

  • 当文件存在并且您的进程/用户拥有必要的权限时,这在 100% 的时间里都有效。如果您知道这些事实是真实的,请发布代码,以便我们帮助您找出其中的错误。
【解决方案2】:

通常操作系统会根据当前目录打开文件的相对地址,而不是可执行位置。

例如,如果您的可执行文件位于/path/to/exec/executable 中,而您从/path/to/invoke 调用它,它将尝试打开Data.txt,就好像它是/path/to/invoke/Data.txt

您可以查看this question 及其答案,了解如何在 Windows 中找到可执行文件的路径。或者 this answer 用于其他各种操作系统。

【讨论】:

    【解决方案3】:

    即使不指定完整路径,它也应该可以工作。您是否从 Visual Studio 启动可执行文件?如果是,请确保 Data.txt 文件位于 *.vcxproj 文件或 *.sln 文件所在的项目目录中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多