I need to create a function that will remove anything such as '..' or '.' in a filepath. So if I did resolvePath("/root\\\\directory1/directory2\\\\\\\\..")
it would return "root/directory1
. I tried making a char* array of each part of the path but I couldn't get each segment of it.
Asked
Active
Viewed 2,017 times
2

László Papp
- 51,870
- 39
- 111
- 135

user3103398
- 143
- 9
-
1any reason not to use boost::filesystem? – odedsh Apr 20 '14 at 13:40
-
What do you mean? I am using it for an emulator and one of the functions is this. – user3103398 Apr 20 '14 at 13:41
-
You really need to post what you've tried so far and be more specific about where you got stuck. – M.M Apr 20 '14 at 13:41
-
1Take a look at http://stackoverflow.com/questions/1746136/how-do-i-normalize-a-pathname-using-boostfilesystem and read documentation about "canonical" function in boost::filesystem – odedsh Apr 20 '14 at 13:42
3 Answers
4
The two really cross-platform alternatives are boost and Qt for this, so here goes it with both demonstrated:
Boost solution: boost::filesystem::canonical
path canonical(const path& p, const path& base = current_path());
path canonical(const path& p, system::error_code& ec);
path canonical(const path& p, const path& base, system::error_code& ec);
Qt solution: QFileInfo
QFileInfo fileInfo("/root\\\\directory1/directory2\\\\\\\\.."))
qDebug() << fileInfo.canonicalFilePath();

László Papp
- 51,870
- 39
- 111
- 135
2
It looks from the example path you gave that you're on a Unix-like system. You can use realpath()
to canonicalize your path then. This exists on Linux, BSD and Mac OS at least.

John Zwinck
- 239,568
- 38
- 324
- 436
1
A working solution is now available from the standard libary (C++17):
#include <iostream>
#include <filesystem>
int main()
{
// resolves based on current dir
std::filesystem::path mypath = std::filesystem::canonical("../dir/file.ext");
std::cout << mypath.generic_string(); // root/parent_dir/dir/file.ext
return 0;
}
Documentation:

Jeremie Brossard
- 11
- 2