в каталоге, в котором находится мой exe-файл, у меня есть папка с именем «save».
Я хочу отобразить файлы, которые содержит этот каталог.
Я использовал код, найденный здесь:
Вывод списка содержимого каталога с использованием C и Windows
Теперь сложная часть.
если я использую .\\saves\\
как мой каталог, он говорит мне, что путь не может быть найден.
Однако, если я использую ..\\release\\saves\\
это работает отлично. Но это глупо. Я не хочу идти в родительскую папку, а затем вернуться. Особенно в связи с тем, что я не знаю, какое имя пользователь дает каталогу, содержащему исполняемый файл (в моем случае это «релиз», но кто знает, что делает пользователь :-D).
Я прочитал это: http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx#fully_qualified_vs._relative_paths но это не очень помогло.
Я тоже пробовал saves\\
или же .\saves\\
но это тоже не работает.
Я надеюсь, что кто-то может сказать мне, как это исправить.
Вы на самом деле не делаете ничего плохого в коде — вы запускаете проект из Visual Studio, которая устанавливает в рабочем каталоге родительский элемент папок Release / Debug.
Перейдите в Проект-> Настройки (Свойства) -> Свойства конфигурации-> Отладка-> Рабочий каталог
Вы также можете запустить exe вне VS и относительные пути будут вести себя так, как вы ожидаете.
Если это относительно пути к исполняемому файлу, а не пути текущего рабочего каталога, вы можете использовать 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;
}
я хотел бы использовать boost::filesystem
http://www.boost.org/doc/libs/1_53_0/libs/filesystem/doc/index.htm.
В качестве бонуса вы получите независимый от операционной системы код.
Я думаю, что ваша ошибка использовала \\saves\\
и забыть указать поисковый параметр / строку
Вы должны использовать:
saves\\*
это будет искать любой файл или папку