从Windows任务栏执行时ifstream问题

ifstream issue when executing from the Windows taskbar

本文关键字:ifstream 问题 执行 Windows 任务栏      更新时间:2023-10-16

我在64位Windows 7机器上在Visual Studio C 2012中写了一个非常简单的程序;它所做的就是使用std :: ifstream打开文件并打印其内容。

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查找执行路径,并且在所有执行中似乎都是相同的。

所以我的问题是,我想念什么?为什么我不能在我的可执行文件旁边的字面上找不到那些字面上的文件,如果它是这样运行的?

如何从任务栏重新启动您的应用程序可能是一个实现细节而不是记录。固定应用程序实际上是您个人资料中存储的快捷方式。如果这打破了您的应用程序,则如果用户使用.yourappapp.exe

手动启动您的应用程序,它也会中断。

相对路径相对于工作目录,而不是可执行文件中的目录。

可以通过多种方式设置新过程的工作目录:

  • 它可以从父过程中继承
  • 呼叫CreateProcess/ShellExecute
  • 时,父进程可以设置特定目录
  • 快捷方式(.lnk)可以指定工作目录

如果要与.exe在同一目录中打开文件,则应根据GetModuleFileName(0)的结果构建完整的路径(PathRemoveFileSpecPathAppend可能会有所帮助)。

如果您永远不会从命令行接受文件名,则可以在打开文件之前手动更改工作目录。