相对文件路径的差异:Qt Creator的调试模式和发布模式的区别

3
 QFile file("test.txt");
 if (file.open(QIODevice::ReadOnly)) {
     qDebug()<<"You got me.";
 }

我正在使用:
  • Qt 4.8.6与MSVC 2010
  • Qt Creator 3.1.1
  • Windows 7(32位)
从以上代码中,如果.pro文件未更改,则对应的构建目录为调试模式
D:\...\build-Main-MSVC2010-Debug

调试模式的.exe将被放置在以下位置:

D:\...\build-Main-MSVC2010-Debug\debug

对于发布模式

D:\...\build-Main-MSVC2010-Release

发布模式下的.exe文件将位于以下位置:

D:\...\build-Main-MSVC2010-Release\release

[问题]

如果我想让发布程序读取“test.txt”文件,我需要将该文件放置在一个文件夹中。

D:\...\build-Main-MSVC2010-Release\release

这很合理。但是如果我想让 调试程序 读取 "test.txt" 文件,我必须将文件放在该文件夹中。
D:\...\build-Main-MSVC2010-Debug\

而不是

D:\...\build-Main-MSVC2010-Debug\debug

我一直纳闷在调试和发布模式下为什么相对路径的工作方式不同,这一点困扰了我很长时间。


[编辑]

感谢 @Paul 和 @lpapp。这是工作目录的屏幕截图:

调试: enter image description here

发布: enter image description here


[非常重要的编辑]

针对 @Paul 和 @lpapp:

我曾经将所需的.dll复制到发布文件夹中进行运行时测试,并且我刚刚发现如果我通过Qt Creator执行发布程序,那么工作目录会像你们说的那样正常工作。但是,如果我直接在发布文件夹中点击.exe文件,则情况将与我在问题中所述的一样。我认为从Qt Creator运行程序和直接执行程序之间可能存在差异。


1
QFile file("test.txt"); -> 嗯,我认为最好使用applicationDirPath + "text.txt"。我认为原因是在执行可执行文件时的当前工作目录。也许您可以在QtCreator中发布两个屏幕截图,以便我们可以看到它们是否相似? - László Papp
非常感激,lpapp。即使没有回答问题,使用QCoreApplication::applicationDirPath()可以解决一切。 - Tay2510
1
哦,我刚刚注意到您的编辑。确实,区别在于工作目录不能保证相同,这取决于您从何处运行它。 - László Papp
谢谢,我想将来我会只使用 applicationDirPath() 。这样更安全。 - Tay2510
1个回答

1
这取决于您程序的当前工作目录。您可以在项目->运行设置->运行->工作目录中进行更改。

enter image description here

如果我通过Qt Creator执行发布程序,工作目录将像您所说的那样工作。但是如果我直接在发布文件夹中点击.exe,情况就会像我在问题中所说的那样。
这是因为当您单击发布文件夹中的.exe时,该文件夹是程序的工作目录。当您从Qt Creator运行程序时,Qt Creator明确设置工作目录。您可以覆盖工作目录以使其成为创建.exe文件的目录,因此无论您是从Qt Creator运行程序还是仅从资源管理器中单击.exe,都不会有任何区别。

谢谢,我差不多要接受这个答案了。但是我的工作目录在发布模式下是 D:\Project\Test\Builds\build-Main-MSVC2010-Release,它没有子文件夹,和调试模式一样。这太奇怪了。 - Tay2510
@Tay2510 在你编辑问题并添加最后一段之后,我编辑了答案。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接