8 #ifndef SIG_UTIL_PASS_HPP
9 #define SIG_UTIL_PASS_HPP
11 #include "../helper/helper_modules.hpp"
12 #include "../helper/maybe.hpp"
13 #include "../string/manipulate.hpp"
18 #elif SIG_USE_BOOST_FILESYSTEM
19 #include "../string/regex.hpp"
20 #include <boost/filesystem.hpp>
21 namespace fs = boost::filesystem;
43 inline auto modify_dirpass_tail(FilepassString
const& directory_pass,
bool const has_slash) ->FilepassString
45 if (directory_pass.empty())
return directory_pass;
47 auto tail = directory_pass.back();
51 if (tail ==
'/' || tail ==
'\\')
return directory_pass;
55 if (tail !=
'/' && tail !=
'\\')
return directory_pass;
57 auto tmp = directory_pass;
76 FilepassString
const& directory_pass,
78 std::wstring extension = L
""
80 ->Maybe<std::vector<std::wstring>>
82 using ResultType = std::vector<std::wstring>;
88 auto query = extension.empty() ? L
"?*" : L
"*" + extension;
90 auto hFind = FindFirstFile(pass.c_str(), &fd);
92 if (hFind == INVALID_HANDLE_VALUE){
93 return Nothing(std::move(result));
97 if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
Consistency(hidden_file, (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)))
99 result.push_back(std::wstring(fd.cFileName));
101 }
while (FindNextFile(hFind, &fd));
104 return Just<ResultType>(std::move(result));
106 #elif SIG_ENABLE_BOOST
107 auto IsHidden = [](fs::path
const& p){
108 auto name = p.filename();
109 if (name.c_str()[0] ==
'.' && name !=
".." && name !=
".")
return true;
113 fs::directory_iterator
end;
114 for (fs::directory_iterator it(directory_pass); it !=
end; ++it)
116 if (!fs::is_directory(*it) &&
Consistency(hidden_file, IsHidden(*it))){
117 auto leaf =
sig::split(it->path().wstring(), L
"/").back();
118 if (extension.empty()) result.push_back(leaf);
122 if (
isJust(ext) &&
fromJust(ext)[0][1] == extension) result.push_back(leaf);
126 return Just<ResultType>(std::move(result));
128 std::cout <<
"I don't support this envirnment which is default. please include boost if any." << std::endl;
144 FilepassString
const& directory_pass,
147 ->Maybe<std::vector<std::wstring>>
149 using ResultType = std::vector<std::wstring>;
156 auto hFind = FindFirstFile(pass.c_str(), &fd);
158 if (hFind == INVALID_HANDLE_VALUE){
159 return Nothing(std::move(result));
163 if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
Consistency(hidden_file, (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)))
165 auto tmp = std::wstring(fd.cFileName);
166 if(tmp != L
"." && tmp != L
"..") result.push_back(tmp);
168 }
while (FindNextFile(hFind, &fd));
171 return Just<ResultType>(std::move(result));
173 #elif SIG_ENABLE_BOOST
174 auto IsHidden = [](fs::path
const& p){
175 auto name = p.filename();
176 if (name.c_str()[0] ==
'.' && name !=
".." && name !=
".")
return true;
180 fs::directory_iterator
end;
181 for (fs::directory_iterator it(directory_pass); it !=
end; ++it)
183 if (fs::is_directory(*it) &&
Consistency(hidden_file, IsHidden(*it))){
184 result.push_back(
sig::split(it->path().wstring(), L
"/").back());
187 return Just<ResultType>(std::move(result));
189 std::cout <<
"I don't support this envirnment which is default. please include boost if any." << std::endl;
auto get_folder_names(FilepassString const &directory_pass, bool hidden_file) -> Maybe< std::vector< std::wstring >>
指定ディレクトリにあるフォルダ名を取得
auto split(S const &src, impl::string_t< S > const &delimiter) -> CSeq< TS >
文字列(src)をある文字列(delimiter)を目印に分割する
auto end(C &&c) -> std::move_iterator< typename RC::iterator >
auto Nothing() -> typename impl::SameIf< T, void, typename boost::none_t, Maybe< T >>::type
値コンストラクタ
auto modify_dirpass_tail(FilepassString const &directory_pass, bool const has_slash) -> FilepassString
ディレクトリ・ファイルパスの末尾に'/'or'\'があるかチェックし、付けるか外すかどうかを指定して反映 ...
auto get_file_names(FilepassString const &directory_pass, bool hidden_file, std::wstring extension=L"") -> Maybe< std::vector< std::wstring >>
指定ディレクトリにあるファイル名を取得
bool Consistency(B1 &&a, B2 &&b)
AとBの真偽一致でtrueを返す (⇔ !xor)
#define SIG_TO_FPSTR(str)
bool isJust(Maybe< T > const &m)
Justであるか調べる関数.Maybe a -> Bool.
T & fromJust(Maybe< T > &m)
Justから値を取り出す関数.Maybe a -> a.
auto regex_search(S &&src, typename impl::Str2RegexSelector< TS >::regex const &expression) -> Maybe< std::vector< std::vector< TS >>>
std::regex_search のラッパ関数
auto escape_regex(std::string const &expression) -> std::string
与えられた文字中に含まれる、正規表現の特殊文字をエスケープする