8 #ifndef SIG_UTIL_FILE_HPP
9 #define SIG_UTIL_FILE_HPP
12 #include "helper/helper.hpp"
19 #elif SIG_USE_BOOST_FILESYSTEM
20 #include <boost/filesystem.hpp>
21 namespace fs = boost::filesystem;
31 inline auto modify_dirpass_tail(FilepassString
const& directory_pass,
bool const has_slash) ->FilepassString
33 if (directory_pass.empty())
return directory_pass;
35 auto tail = directory_pass.back();
39 if (tail ==
'/' || tail ==
'\\')
return directory_pass;
41 else return (directory_pass + L
"/");
43 else return (directory_pass +
"/");
47 if (tail !=
'/' && tail !=
'\\')
return directory_pass;
49 auto tmp = directory_pass;
63 FilepassString
const& directory_pass,
65 std::wstring extension = L
""
66 ) ->Just<std::vector<std::wstring>>
68 typedef std::vector<std::wstring> ResultType;
73 auto query = extension.empty() ? L
"?*" : L
"*" + extension;
75 auto hFind = FindFirstFile(pass.c_str(), &fd);
77 if (hFind == INVALID_HANDLE_VALUE){
78 return Nothing(std::move(result));
82 if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
Consistency(hidden_file, (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)))
84 result.push_back(std::wstring(fd.cFileName));
86 }
while (FindNextFile(hFind, &fd));
89 return Just<ResultType>(std::move(result));
91 #elif SIG_ENABLE_BOOST
92 auto IsHidden = [](fs::path
const& p){
93 auto name = p.filename();
94 if (name.c_str()[0] ==
'.' && name !=
".." && name !=
".")
return true;
98 fs::directory_iterator
end;
99 for (fs::directory_iterator it(directory_pass); it !=
end; ++it)
101 if (!fs::is_directory(*it) &&
Consistency(hidden_file, IsHidden(*it))){
102 auto leaf =
sig::split(it->path().wstring(), L
"/").back();
103 if (extension.empty()) result.push_back(leaf);
107 if (is_container_valid(ext) &&
fromJust(ext)[0][1] == extension) result.push_back(leaf);
111 return Just<ResultType>::type(std::move(result));
113 std::cout <<
"I don't support this envirnment which is default. please include boost if any." << std::endl;
124 FilepassString
const& directory_pass,
126 ) ->Just<std::vector<std::wstring>>
128 typedef std::vector<std::wstring> ResultType;
134 auto hFind = FindFirstFile(pass.c_str(), &fd);
136 if (hFind == INVALID_HANDLE_VALUE){
137 return Nothing(std::move(result));
141 if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
Consistency(hidden_file, (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)))
143 auto tmp = std::wstring(fd.cFileName);
144 if(tmp != L
"." && tmp != L
"..") result.push_back(tmp);
146 }
while (FindNextFile(hFind, &fd));
149 return Just<ResultType>(std::move(result));
151 #elif SIG_ENABLE_BOOST
152 auto IsHidden = [](fs::path
const& p){
153 auto name = p.filename();
154 if (name.c_str()[0] ==
'.' && name !=
".." && name !=
".")
return true;
158 fs::directory_iterator
end;
159 for (fs::directory_iterator it(directory_pass); it !=
end; ++it)
161 if (fs::is_directory(*it) &&
Consistency(hidden_file, IsHidden(*it))){
162 result.push_back(
sig::split(it->path().wstring(), L
"/").back());
165 return Just<ResultType>(std::move(result));
167 std::cout <<
"I don't support this envirnment which is default. please include boost if any." << std::endl;
178 inline void clear_file(FilepassString
const& file_pass)
180 std::ofstream ofs(file_pass);
184 #define SIG_FILE_LOCALE_INIT\
185 static bool first = true;\
187 std::locale::global(std::locale(""));\
196 template <class T, typename std::enable_if<!container_traits<T>::exist>::type*& =
enabler>
199 typename impl::FStreamSelector<T>::ofstream& ofs)
201 ofs << src << std::endl;
207 template <class C, typename std::enable_if<container_traits<C>::exist>::type*& =
enabler>
213 for (
auto const& str : src){
214 std::copy(str.begin(), str.end(), streambuf_iter);
215 streambuf_iter =
'\n';
223 template <class T, typename std::enable_if<!container_traits<T>::exist>::type*& =
enabler>
226 FilepassString
const& file_pass,
231 const auto open_mode = mode ==
WriteMode::overwrite ? std::ios::out : std::ios::out | std::ios::app;
232 typename impl::FStreamSelector<T>::ofstream ofs(file_pass, open_mode);
240 template <class C, typename std::enable_if<container_traits<C>::exist>::type*& =
enabler>
243 FilepassString
const& file_pass,
248 const auto open_mode = mode ==
WriteMode::overwrite ? std::ios::out : std::ios::out | std::ios::app;
249 typename impl::FStreamSelector<typename container_traits<C>::value_type>::ofstream ofs(file_pass, open_mode);
259 template <class C, typename std::enable_if<container_traits<C>::exist && !container_traits<typename container_traits<C>::value_type>::exist>::type*& =
enabler>
262 FilepassString
const& file_pass,
264 std::string delimiter =
"\n")
266 save_line(cat_str(src, delimiter), file_pass, mode);
275 template <class CC, typename std::enable_if<container_traits<typename container_traits<CC>::value_type>::exist>::type*& =
enabler>
278 FilepassString
const& file_pass,
280 std::string delimiter1 =
"\n",
281 std::string delimiter2 =
"\n\n")
283 std::vector<std::string> tmp;
285 for (
auto const& line : src){
286 tmp.push_back(cat_str(line, delimiter1));
301 template <class C, class R = typename container_traits<C>::value_type>
307 static_assert(std::is_same<R,
typename container_traits<C>::value_type>::value,
"error in read_line: R and C::value_type don't match");
313 while (ifs && std::getline(ifs, line)){
314 conv ? container_traits<C>::add_element(empty_dest, conv(std::move(line))) : container_traits<C>::add_element(empty_dest, std::move(line));
316 return static_cast<bool>(ifs);
323 template <class C, class R = typename container_traits<C>::value_type>
326 FilepassString
const& file_pass,
341 template <
class R,
class C = std::vector<R>>
346 return tmp.size() ? Just<C>(std::move(tmp)) :
Nothing(std::move(tmp));
353 template <
class R,
class C = std::vector<R>>
354 auto read_line(FilepassString
const& file_pass) ->Just<C>
361 return read_line<R, C>(ifs);
364 template <
class R,
class C = std::vector<R>>
367 return read_line<R, C>(
static_cast<impl::TString<FilepassStringC>
>(file_pass));
376 template <class C, class RT = typename container_traits<C>::value_type,
typename std::enable_if<!container_traits<typename container_traits<C>::value_type>::exist>::type*& =
enabler>
379 FilepassString
const& file_pass,
380 std::string delimiter =
"\n")
382 auto read_str = read_line<std::string>(file_pass);
384 if (!is_container_valid(read_str))
return false;
386 if (delimiter ==
"\n"){
387 for (
auto const& line :
fromJust(read_str)){
405 template <class CC, class RC = typename container_traits<CC>::value_type,
class RT =
typename container_traits<RC>::value_type>
408 FilepassString
const& file_pass,
409 std::string delimiter1 =
"\n",
410 std::string delimiter2 =
"\n\n")
412 auto read_str = read_line<std::string>(file_pass);
413 if (!is_container_valid(read_str))
return false;
415 for (
auto const& line :
fromJust(read_str)){
417 auto sp =
split(line, delimiter);
419 for (
auto const& v : sp){
422 container_traits<CC>::add_element(empty_dest, std::move(tmp));
431 template <class C, typename std::enable_if<container_traits<C>::exist && !container_traits<typename container_traits<C>::value_type>::exist>::type*& =
enabler>
433 FilepassString
const& file_pass,
434 std::string delimiter =
"\n"
438 read_num(tmp, file_pass, delimiter);
439 return tmp.size() ? Just<C>(std::move(tmp)) :
Nothing(std::move(tmp));
446 template <class CC, typename std::enable_if<container_traits<typename container_traits<CC>::value_type>::exist>::type*& =
enabler>
448 FilepassString
const& file_pass,
449 std::string delimiter
453 read_num(tmp, file_pass, delimiter);
454 return tmp.size() ? Just<CC>(std::move(tmp)) :
Nothing(std::move(tmp));
bool read_num(C &empty_dest, FilepassString const &file_pass, std::string delimiter="\n")
typename impl::SameIf< R, std::string, std::ifstream, std::wifstream >::type IfsSelector
bool read_line(C &empty_dest, IfsSelector< R > &ifs, std::function< R(typename impl::SameIf< R, std::string, std::string, std::wstring >::type) > const &conv=nullptr)
auto get_folder_names(FilepassString const &directory_pass, bool hidden_file) -> Maybe< std::vector< std::wstring >>
指定ディレクトリにあるフォルダ名を取得
void clear_file(FilepassString const &file_pass)
ファイル内容の初期化
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
値コンストラクタ
WriteMode
SaveLine, SaveNum の保存に関する設定
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 >>
指定ディレクトリにあるファイル名を取得
void save_num(C const &src, FilepassString const &file_pass, std::string delimiter, WriteMode open_mode=WriteMode::overwrite)
数値列(ex:ベクトル)の保存
bool Consistency(B1 &&a, B2 &&b)
AとBの真偽一致でtrueを返す (⇔ !xor)
void save_line(T src, typename impl::FStreamSelector< T >::ofstream &ofs)
ファイルへ1行ずつ保存
typename std::conditional< std::is_same< T1, T2 >::value, TrueT, FalseT >::type type
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 のラッパ関数
#define SIG_FILE_LOCALE_INIT
auto escape_regex(std::string const &expression) -> std::string
与えられた文字中に含まれる、正規表現の特殊文字をエスケープする
auto copy(C &&src) -> RC
別の種類のコンテナに要素をコピーする