относительный путь для поиска каталога с FindFirstFile

в каталоге, в котором находится мой 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\\ но это тоже не работает.

Я надеюсь, что кто-то может сказать мне, как это исправить.

2

Решение

Вы на самом деле не делаете ничего плохого в коде — вы запускаете проект из Visual Studio, которая устанавливает в рабочем каталоге родительский элемент папок Release / Debug.

Перейдите в Проект-> Настройки (Свойства) -> Свойства конфигурации-> Отладка-> Рабочий каталог

Вы также можете запустить exe вне VS и относительные пути будут вести себя так, как вы ожидаете.

2

Другие решения

Если это относительно пути к исполняемому файлу, а не пути текущего рабочего каталога, вы можете использовать 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;
}
1

я хотел бы использовать boost::filesystem
http://www.boost.org/doc/libs/1_53_0/libs/filesystem/doc/index.htm.

В качестве бонуса вы получите независимый от операционной системы код.

0

Я думаю, что ваша ошибка использовала \\saves\\и забыть указать поисковый параметр / строку
Вы должны использовать:

saves\\*

это будет искать любой файл или папку

0
По вопросам рекламы [email protected]