📄 findfile_sequence.hpp
字号:
// basic_findfile_sequence_value_type
template <ss_typename_param_k C, ss_typename_param_k T>
inline basic_findfile_sequence_value_type<C, T>::basic_findfile_sequence_value_type()
{
m_data.dwFileAttributes = 0xFFFFFFFF;
m_data.cFileName[0] = '\0';
m_data.cAlternateFileName[0] = '\0';
m_path[0] = '\0';
m_pathLen = 0;
}
template <ss_typename_param_k C, ss_typename_param_k T>
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::class_type &basic_findfile_sequence_value_type<C, T>::operator =(ss_typename_type_k basic_findfile_sequence_value_type<C, T>::class_type const &rhs)
{
m_data = rhs.m_data;
m_path = rhs.m_path;
m_pathLen = rhs.m_pathLen;
return *this;
}
#if 0
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline basic_findfile_sequence_value_type<C, T>::operator basic_findfile_sequence_value_type<C, T>::char_type const *() const
#else
inline basic_findfile_sequence_value_type<C, T>::operator char_type const *() const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return m_data.cFileName;
}
#endif /* 0 */
template <ss_typename_param_k C, ss_typename_param_k T>
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::find_data_type const &basic_findfile_sequence_value_type<C, T>::get_find_data() const
{
return m_data;
}
#ifdef STLSOFT_OBSOLETE
template <ss_typename_param_k C, ss_typename_param_k T>
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::find_data_type const &basic_findfile_sequence_value_type<C, T>::GetFindData() const
{
return get_find_data();
}
#endif /* STLSOFT_OBSOLETE */
template <ss_typename_param_k C, ss_typename_param_k T>
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::char_type const *basic_findfile_sequence_value_type<C, T>::get_filename() const
{
return m_data.cFileName;
}
template <ss_typename_param_k C, ss_typename_param_k T>
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::char_type const *basic_findfile_sequence_value_type<C, T>::get_short_filename() const
{
return m_data.cAlternateFileName[0] != '\0' ? m_data.cAlternateFileName : m_data.cFileName;
}
template <ss_typename_param_k C, ss_typename_param_k T>
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::char_type const *basic_findfile_sequence_value_type<C, T>::get_path() const
{
return m_path.c_str();
}
template <ss_typename_param_k C, ss_typename_param_k T>
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::char_type const *basic_findfile_sequence_value_type<C, T>::c_str() const
{
return get_path();
}
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::size_type basic_findfile_sequence_value_type<C, T>::length() const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ss_size_t basic_findfile_sequence_value_type<C, T>::length() const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
WINSTL_ASSERT(traits_type::str_len(this->c_str()) == m_pathLen);
return m_pathLen;
}
template <ss_typename_param_k C, ss_typename_param_k T>
#if defined(STLSOFT_COMPILER_IS_GCC) || \
( defined(STLSOFT_COMPILER_IS_MSVC) && \
_MSC_VER < 1100)
inline basic_findfile_sequence_value_type<C, T>::operator C const * () const
#else /* ? compiler */
inline basic_findfile_sequence_value_type<C, T>::operator ss_typename_type_k basic_findfile_sequence_value_type<C, T>::char_type const * () const
#endif /* compiler */
{
return get_path();
}
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::bool_type basic_findfile_sequence_value_type<C, T>::is_directory() const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ws_bool_t basic_findfile_sequence_value_type<C, T>::is_directory() const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return traits_type::is_directory(&m_data);
}
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::bool_type basic_findfile_sequence_value_type<C, T>::is_file() const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ws_bool_t basic_findfile_sequence_value_type<C, T>::is_file() const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return traits_type::is_file(&m_data);
}
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::bool_type basic_findfile_sequence_value_type<C, T>::is_compressed() const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ws_bool_t basic_findfile_sequence_value_type<C, T>::is_compressed() const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return 0 != (m_data.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED);
}
#ifdef FILE_ATTRIBUTE_REPARSE_POINT
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::bool_type basic_findfile_sequence_value_type<C, T>::is_reparse_point() const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ws_bool_t basic_findfile_sequence_value_type<C, T>::is_reparse_point() const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return 0 != (m_data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT);
}
#endif /* FILE_ATTRIBUTE_REPARSE_POINT */
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::bool_type basic_findfile_sequence_value_type<C, T>::is_read_only() const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ws_bool_t basic_findfile_sequence_value_type<C, T>::is_read_only() const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return 0 != (m_data.dwFileAttributes & FILE_ATTRIBUTE_READONLY);
}
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::bool_type basic_findfile_sequence_value_type<C, T>::is_system() const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ws_bool_t basic_findfile_sequence_value_type<C, T>::is_system() const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return 0 != (m_data.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM);
}
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::bool_type basic_findfile_sequence_value_type<C, T>::is_hidden() const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ws_bool_t basic_findfile_sequence_value_type<C, T>::is_hidden() const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return 0 != (m_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN);
}
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::bool_type basic_findfile_sequence_value_type<C, T>::equal(ss_typename_type_k basic_findfile_sequence_value_type<C, T>::char_type const *rhs) const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ws_bool_t basic_findfile_sequence_value_type<C, T>::equal(char_type const *rhs) const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return 0 == traits_type::str_compare_no_case(this->get_path(), rhs);
}
template <ss_typename_param_k C, ss_typename_param_k T>
#ifdef STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED
inline ss_typename_type_k basic_findfile_sequence_value_type<C, T>::bool_type basic_findfile_sequence_value_type<C, T>::equal(basic_findfile_sequence_value_type<C, T> const &rhs) const
#else /* ? STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
inline ws_bool_t basic_findfile_sequence_value_type<C, T>::equal(basic_findfile_sequence_value_type<C, T> const &rhs) const
#endif /* STLSOFT_CF_FUNCTION_SIGNATURE_FULL_ARG_QUALIFICATION_REQUIRED */
{
return equal(rhs.get_path());
}
// basic_findfile_sequence_const_input_iterator
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k V>
inline /* static */ HANDLE basic_findfile_sequence_const_input_iterator<C, T, V>::find_first_file_( ss_typename_type_k basic_findfile_sequence_const_input_iterator<C, T, V>::char_type const *searchSpec
, flags_type flags
, ss_typename_type_k basic_findfile_sequence_const_input_iterator<C, T, V>::find_data_type *findData)
{
HANDLE hSrch = INVALID_HANDLE_VALUE;
// A constant makes Borland weep the tears of unfathomable sadness, so an enum is used instead
// const DWORD reparsePointConstant = 0x00000400;
enum
{
#ifdef FILE_ATTRIBUTE_REPARSE_POINT
reparsePointConstant = FILE_ATTRIBUTE_REPARSE_POINT
#else /* ? FILE_ATTRIBUTE_REPARSE_POINT */
reparsePointConstant = 0x00000400
#endif /* FILE_ATTRIBUTE_REPARSE_POINT */
};
#if defined(_WIN32_WINNT) && \
_WIN32_WINNT >= 0x0400
if( (sequence_type::directories == (flags & (sequence_type::directories | sequence_type::files))) &&
system_version::winnt() &&
system_version::major() >= 4)
{
hSrch = traits_type::find_first_file_ex(searchSpec, FindExSearchLimitToDirectories, findData);
}
else
#endif /* _WIN32_WINNT >= 0x0400 */
if(INVALID_HANDLE_VALUE == hSrch)
{
hSrch = traits_type::find_first_file(searchSpec, findData);
}
#ifdef _DEBUG
if(INVALID_HANDLE_VALUE == hSrch)
{
::GetLastError();
}
#endif /* _DEBUG */
// Now need to validate against the flags
for(; INVALID_HANDLE_VALUE != hSrch; )
{
if( traits_type::is_file(findData) &&
( 0 == (flags & sequence_type::skipHiddenFiles) ||
0 == (findData->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)))
{
// A file, and files requested, so break
if(flags & sequence_type::files)
{
break;
}
}
else
{
if( 0 == (flags & sequence_type::skipHiddenDirs) ||
0 == (findData->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
{
if(traits_type::is_dots(findData->cFileName))
{
if(flags & sequence_type::includeDots)
{
// A dots file, and dots are requested
break;
}
}
else if(flags & sequence_type::directories)
{
// A directory, and directories requested
if( 0 == (flags & sequence_type::skipReparseDirs) ||
0 == (findData->dwFileAttributes & reparsePointConstant))
{
// Either not requested to skip reparse points, or not a reparse point
break;
}
}
}
}
if(!traits_type::find_next_file(hSrch, findData))
{
::FindClose(hSrch);
hSrch = INVALID_HANDLE_VALUE;
break;
}
}
return hSrch;
}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k V>
inline basic_findfile_sequence_const_input_iterator<C, T, V>::basic_findfile_sequence_const_input_iterator()
: m_list(NULL)
, m_handle(NULL)
, m_subpath()
, m_subPathLen(0)
, m_pattern0(NULL)
, m_pattern1(NULL)
, m_delim('\0')
, m_flags(0)
{
m_subpath[0] = '\0';
}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k V>
inline basic_findfile_sequence_const_input_iterator<C, T, V>::basic_findfile_sequence_const_input_iterator( sequence_type const &l
#if 0
, ss_typename_type_k basic_findfile_sequence_const_input_iterator<C, T, V>::char_type const *rootDir
#endif /* 0 */
, ss_typename_type_k basic_findfile_sequence_const_input_iterator<C, T, V>::char_type const *patterns
, ss_typename_type_k basic_findfile_sequence_const_input_iterator<C, T, V>::char_type delim
, flags_type flags)
: m_list(&l)
, m_handle(NULL)
, m_subpath()
, m_subPathLen(0)
, m_pattern0(patterns)
, m_pattern1(patterns)
, m_delim(delim)
, m_flags(flags)
{
m_subpath[0] = '\0';
operator ++();
}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k V>
inline basic_findfile_sequence_const_input_iterator<C, T, V>::basic_findfile_sequence_const_input_iterator(sequence_type const &l)
: m_list(&l)
, m_handle(NULL)
, m_subpath()
, m_subPathLen(0)
, m_pattern0(NULL)
, m_pattern1(NULL)
, m_delim('\0')
, m_flags(0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -