Fix fs::delim type, fix "." and ".." processing in fs::get_parent_dir (#8975)

* Fix fs::delim type

* Fix fs::get_parent_dir: "." and ".." processing
This commit is contained in:
Eladash 2020-09-26 21:18:32 +03:00 committed by GitHub
parent 0f67c68993
commit 8ad36e2526
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 16 deletions

View File

@ -322,20 +322,12 @@ std::shared_ptr<fs::device_base> fs::set_virtual_device(const std::string& name,
std::string fs::get_parent_dir(const std::string& path)
{
// Search upper bound (set to the last character, npos for empty string)
auto last = path.size() - 1;
// Get (basically) processed path
const auto real_path = fs::escape_path(path);
while (true)
{
const auto pos = path.find_last_of(delim, last, sizeof(delim) - 1);
const auto pos = real_path.find_last_of(delim);
// Contiguous slashes are ignored at the end
if (std::exchange(last, pos - 1) != pos)
{
// Return empty string if the path doesn't contain at least 2 elements
return path.substr(0, pos != umax && path.find_last_not_of(delim, pos, sizeof(delim) - 1) != umax ? pos : 0);
}
}
return real_path.substr(0, pos == umax ? 0 : pos);
}
bool fs::stat(const std::string& path, stat_t& info)

View File

@ -11,12 +11,12 @@
namespace fs
{
#ifdef _WIN32
static constexpr auto delim = "/\\";
static constexpr auto wdelim = L"/\\";
static constexpr auto& delim = "/\\";
static constexpr auto& wdelim = L"/\\";
using native_handle = void*;
#else
static constexpr auto delim = "/";
static constexpr auto wdelim = L"/";
static constexpr auto& delim = "/";
static constexpr auto& wdelim = L"/";
using native_handle = int;
#endif