【问题标题】:Opening a file in the current directory在当前目录中打开文件
【发布时间】:2013-11-04 03:11:17
【问题描述】:

我正在尝试加载文件,之前我使用的是硬编码的文件位置(如“c:\location\file.txt”),但现在有几个朋友也在使用该文件,我想允许他们将可执行文件放在任何他们想要的地方。

我当前的代码如下:

ifstream myfile;
myfile.open("c:\\client\\settings.cfg");

我正在尝试更改它,以便用户将他们的可执行文件放入他们想要的任何文件夹中,然后他们创建一个文件夹并将他们的设置文件放入其中,exe 将使用他们的设置加载它。

ifstream myfile;
myfile.open("\\settings\\settings.cfg");

我有一些基本的错误处理,现在程序总是出错,说它找不到文件。

文件结构如下:

[ART]
  asset.png
[SETTINGS]
  settings.cfg
client.exe

这似乎是一件非常简单的事情,但我找不到任何方法。每个关于读取和写入文件的示例和教程都只处理可执行文件目录中的文件,或者硬编码到 c:\folder...

谁能指出我是如何做到这一点的?

【问题讨论】:

    标签: c++ file directory


    【解决方案1】:

    大多数系统的搜索路径从当前工作目录开始,然后是PATH 环境变量。因此,您需要做的就是指定没有绝对路径标记的文件/文件夹,它将使用相对于工作目录的路径:

    ifstream myfile;
    myfile.open("settings\\settings.cfg");
    //           ^^ Note the lack of \\ to start the file path
    

    【讨论】:

    • @user2827019 正如我在回答中提到的,这与可执行文件的目录无关。它仅相对于用户的当前目录。如果用户从其目录中启动可执行文件,它将仅匹配可执行文件的目录。
    • @user2827019:没问题。需要注意的一点是它基于工作目录,而不是可执行目录。因此,如果他们创建一个快捷方式并更改工作目录(Windows 快捷方式的“Start In”文件夹),它将尝试在那里查找。
    【解决方案2】:

    \ 开头的路径总是相对于当前驱动器的根目录。如果当前驱动是C:,那么\settings\settings.cfg就是C:\settings\settings.cfg

    请注意,您可以使用/ 以避免转义所有内容。所以你可以使用:settings/settings.cfg。这将相对于用户的当前目录。但是请注意,这不一定与可执行文件所在的目录相对应。如果您需要可执行文件的目录,则需要使用 Windows API 函数来获取它:

    #include <Windows.h>
    // ...
    
    HMODULE module = GetModuleHandleW(NULL);
    WCHAR path[MAX_PATH];
    GetModuleFileNameW(module, path, MAX_PATH);
    

    现在,如果您想相对于可执行文件的目录打开 settings/settings.cfg,请创建一个以 path 开头的路径,并将 /settings/settings.cfg 附加到它。

    【讨论】:

    • 那么就没有办法了吗?我总是必须为所有东西指定确切的位置?如果我将代码更改为\settings\settings.cfg,它总是会在 C:/settings/settings.cfg 中放置和读取文件,即使它们“安装”到 c:\game 或 c:\client。
    • @user2827019 使用GetModuleFileNameW()函数,如代码所示。
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多