nana/include/nana/filesystem/filesystem_ext.hpp
qPCR4vir 3d00b7c589 comments
(cherry picked from commit 3b57bd0a1f2375ec88e57298276242edaf611b9e)
2019-12-03 19:10:26 +01:00

131 lines
3.3 KiB
C++

/**
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2019 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*
* @file nana\filesystem\filesystem_ext.hpp
* @autor Ariel Vina-Rodriguez:
* @brief Some convenient extensions to the filesystem library.
*
*/
#ifndef NANA_FILESYSTEM_EXT_HPP
#define NANA_FILESYSTEM_EXT_HPP
#include <nana/deploy.hpp>
#include <nana/filesystem/filesystem.hpp>
namespace nana
{
namespace filesystem_ext
{
#if defined(NANA_WINDOWS)
constexpr auto const def_root = "C:";
constexpr auto const def_rootstr = "C:\\";
constexpr auto const def_rootname = "Local Drive(C:)";
#elif defined(NANA_POSIX)
constexpr auto const def_root = "/";
constexpr auto const def_rootstr = "/";
constexpr auto const def_rootname = "Root/";
#endif
std::filesystem::path path_user(); ///< extention ?
inline bool is_directory(const std::filesystem::directory_entry& dir) noexcept
{
return is_directory(dir.status());
}
//template<class DI> // DI = directory_iterator from std, boost, or nana : return directory_entry
class directory_only_iterator : public std::filesystem::directory_iterator
{
using directory_iterator = std::filesystem::directory_iterator;
directory_only_iterator& find_first()
{
directory_only_iterator end{};
while (*this != end)
{
if (is_directory((*(*this)).status()))
return *this;
this->directory_iterator::operator++();
}
return *this;
}
public:
directory_only_iterator() = default;
template <typename Arg, typename... Args>
directory_only_iterator(Arg&& arg, Args&&... args) : directory_iterator(arg, std::forward<Args>(args)...)
{
find_first();
}
directory_only_iterator& operator++()
{
this->directory_iterator::operator++();
return find_first();
}
};
inline directory_only_iterator begin(directory_only_iterator iter) noexcept
{
return iter;
}
inline directory_only_iterator end(const directory_only_iterator&) noexcept
{
return{};
}
//template<class DI> // DI = directory_iterator from std, boost, or nana : value_type directory_entry
class regular_file_only_iterator : public std::filesystem::directory_iterator
{
using directory_iterator = std::filesystem::directory_iterator;
regular_file_only_iterator& find_first()
{
while (((*this) != directory_iterator{}) && !is_regular_file((**this).status()))
this->directory_iterator::operator++();
return (*this);
}
public:
regular_file_only_iterator() = default;
template <typename Arg, typename... Args>
regular_file_only_iterator(Arg&& arg, Args&&... args) : directory_iterator(std::forward<Arg>(arg), std::forward<Args>(args)...)
{
find_first();
}
regular_file_only_iterator& operator++()
{
this->directory_iterator::operator++();
return find_first();
}
};
inline regular_file_only_iterator begin(regular_file_only_iterator iter) noexcept
{
return iter;
}
inline regular_file_only_iterator end(const regular_file_only_iterator&) noexcept
{
return{};
}
std::string pretty_file_size(const std::filesystem::path& path);
std::string pretty_file_date(const std::filesystem::path& path);
bool modified_file_time(const std::filesystem::path& p, struct tm&); ///< extention ?
} // filesystem_ext
} // nana
#endif //NANA_FILESYSTEM_EXT_HPP