在包含我的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\\
,但它也无效。
我希望有人能告诉我如何解决这个问题。
答案 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。
作为奖励,您将获得与操作系统无关的代码。