diff --git a/include/nana/filesystem/filesystem.hpp b/include/nana/filesystem/filesystem.hpp index 520cdf1c..9d9c62f5 100644 --- a/include/nana/filesystem/filesystem.hpp +++ b/include/nana/filesystem/filesystem.hpp @@ -175,7 +175,13 @@ namespace nana { namespace experimental { namespace filesystem unknown = 0xFFFF ///< not known, such as when a file_status object is created without specifying the permissions }; //enum class copy_options; - //enum class directory_options; + + enum class directory_options + { + none, + follow_directory_symlink, + skip_permission_denied + }; struct space_info { @@ -357,7 +363,8 @@ namespace nana { namespace experimental { namespace filesystem public: directory_iterator() noexcept; - explicit directory_iterator(const path& dir); + explicit directory_iterator(const path& p); + directory_iterator(const path& p, directory_options opt); const value_type& operator*() const; const value_type* operator->() const; @@ -381,6 +388,7 @@ namespace nana { namespace experimental { namespace filesystem private: bool end_{false}; path::string_type path_; + directory_options option_{ directory_options::opt }; std::shared_ptr find_ptr_; find_handle handle_{nullptr}; diff --git a/source/filesystem/filesystem.cpp b/source/filesystem/filesystem.cpp index bb83039c..aa2c6ab4 100644 --- a/source/filesystem/filesystem.cpp +++ b/source/filesystem/filesystem.cpp @@ -102,6 +102,22 @@ namespace nana std::string pretty_file_date(const fs::path& path) // todo: move to .cpp { + struct tm t; + if (modified_file_time(path, t)) + { + std::stringstream tm; + tm << std::put_time(&t, "%Y-%m-%d, %H:%M:%S"); + return tm.str(); + } + return {}; + +/* + // Deprecated + //Windows stores file times using the FILETIME structure, which is a 64 bit value of 100ns intervals from January 1, 1601. + //What's worse is that this 1601 date is fairly common to see given that it's the all zeroes value, and it is far before the + //earliest date representable with time_t.std::filesystem can't change the reality of the underlying platform. + + try { #if NANA_USING_BOOST_FILESYSTEM // The return type of boost::filesystem::last_write_time isn't @@ -117,7 +133,9 @@ namespace nana if (ftime == ((fs::file_time_type::min)())) return{}; - auto cftime = static_cast(ftime.time_since_epoch().count()); + //A workaround for VC2013 + using time_point = decltype(ftime); + auto cftime = time_point::clock::to_time_t(ftime); std::stringstream tm; tm << std::put_time(std::localtime(&cftime), "%Y-%m-%d, %H:%M:%S"); @@ -126,6 +144,8 @@ namespace nana catch (...) { return{}; } +#endif +*/ } bool modified_file_time(const fs::path& p, struct tm& t) @@ -442,6 +462,8 @@ namespace nana { namespace experimental { namespace filesystem { #ifdef NANA_WINDOWS std::replace(pathstr_.begin(), pathstr_.end(), L'/', L'\\'); +#else + std::replace(pathstr_.begin(), pathstr_.end(), '\\', '/'); #endif return *this; } @@ -652,6 +674,12 @@ namespace nana { namespace experimental { namespace filesystem _m_prepare(file_path); } + directory_iterator::directory_iterator(const path& p, directory_options opt): + option_(opt) + { + _m_prepare(p); + } + const directory_iterator::value_type& directory_iterator::operator*() const { return value_; } const directory_iterator::value_type*