使用FindFirstFile搜索目录的相对路径

时间:2013-03-05 15:06:48

标签: c++ path relative

在包含我的exe的目录中,我有一个名为“saved”的文件夹。 我想显示此目录包含的文件。

我使用了以下代码: Listing directory contents using C and Windows

现在是棘手的部分。 如果我使用.\\saves\\作为我的目录,它会告诉我无法找到路径。 但是,如果我使用..\\release\\saves\\,它可以正常工作。但那太愚蠢了。我不想去父文件夹,而是回去。特别是关于我不知道用户给包含exe的目录的名称(在我的情况下它是“发布”但是谁知道用户做了什么:-D)。

我读过这篇文章:http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx#fully_qualified_vs._relative_paths但它没有多大帮助。

我也尝试了saves\\.\saves\\,但它也无效。

我希望有人能告诉我如何解决这个问题。

4 个答案:

答案 0 :(得分:2)

你在代码中实际上没有做错 - 你一直在从Visual Studio启动项目,它将工作目录设置为Release / Debug文件夹的父目录。

转到项目 - >设置(属性) - >配置属性 - >调试 - >工作目录

您也可以在VS外部运行exe,相对路径的行为与您期望的一样。

答案 1 :(得分:1)

如果它是从可执行文件的路径开始,而不是从当前工作目录的路径开始,则可以使用GetModuleFileName()来获取可执行文件的完整路径。然后,从路径末尾删除可执行文件的名称,并使用以下代码构建路径:

std::string executable_directory_path()
{
    std::vector<char> full_path_exe(MAX_PATH);

    for (;;)
    {
        const DWORD result = GetModuleFileName(NULL,
                                               &full_path_exe[0],
                                               full_path_exe.size());

        if (result == 0)
        {
            // Report failure to caller.
        }
        else if (full_path_exe.size() == result)
        {
            // Buffer too small: increase size.
            full_path_exe.resize(full_path_exe.size() * 2);
        }
        else
        {
            // Success.
            break;
        }
    } 

    // Remove executable name.
    std::string result(full_path_exe.begin(), full_path_exe.end());
    std::string::size_type i = result.find_last_of("\\/");
    if (std::string::npos != i) result.erase(i);

    return result;
}

答案 2 :(得分:0)

我认为您的错误是使用\\saves\\而忘记指定搜索参数/字符串
你应该使用:

saves\\*

这将搜索任何文件或文件夹

答案 3 :(得分:0)

我会使用boost::filesystem http://www.boost.org/doc/libs/1_53_0/libs/filesystem/doc/index.htm

作为奖励,您将获得与操作系统无关的代码。