【问题标题】:ifstream issue when executing from the Windows taskbar从 Windows 任务栏执行时出现 ifstream 问题
【发布时间】:2017-03-13 14:57:38
【问题描述】:

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

所以我的问题是,我到底错过了什么?如果以这种方式运行,为什么我找不到就在我的可执行文件旁边的那些文件?

【问题讨论】:

  • 可能工作目录不同?
  • 工作目录很可能发生了变化。如果您使用绝对文件路径而不是相对路径会发生什么?
  • GetModuleFileName为可执行路径,与当前工作目录基本无关。
  • @NathanOliver 正如我所说,它有效。
  • @AlgirdasPreidžius 为什么固定后会改变?

标签: c++ windows


【解决方案1】:

您的应用程序如何从任务栏重新启动可能是一个实现细节,并且没有记录在案。固定的应用程序实际上是存储在您的个人资料中的快捷方式。如果这会破坏您的应用程序,那么如果用户使用.\yourapp\app.exe 之类的路径手动启动您的应用程序,它也会中断!

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

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

  • 可以从父进程继承
  • 父进程调用CreateProcess/ShellExecute时可以设置具体目录
  • 快捷方式 (.LNK) 可以指定工作目录

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

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

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    相关资源
    最近更新 更多