diff options
author | Andreas Baumann <abaumann@yahoo.com> | 2014-10-15 15:50:00 +0200 |
---|---|---|
committer | Andreas Baumann <abaumann@yahoo.com> | 2014-10-15 15:50:00 +0200 |
commit | b37950fecfb3afb53942fba28e4e36d0b8753351 (patch) | |
tree | 52a51bd7b6a808ee43d4422d79d9d0aee5dde4fd /src/libutil/FileUtils.cpp | |
parent | 1127e07a2a6d6b3c0cbd342396e6c8af7ee54040 (diff) | |
download | crawler-b37950fecfb3afb53942fba28e4e36d0b8753351.tar.gz crawler-b37950fecfb3afb53942fba28e4e36d0b8753351.tar.bz2 |
added file iteration also on Windows
Diffstat (limited to 'src/libutil/FileUtils.cpp')
-rw-r--r-- | src/libutil/FileUtils.cpp | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/src/libutil/FileUtils.cpp b/src/libutil/FileUtils.cpp index 64b1bb1..975a78c 100644 --- a/src/libutil/FileUtils.cpp +++ b/src/libutil/FileUtils.cpp @@ -7,6 +7,8 @@ #else #define WIN32_MEAN_AND_LEAN #include <windows.h> +#include "util/win32/errormsg.hpp" +#include "win32/tcharutils.h" #endif #include <sstream> @@ -61,10 +63,65 @@ static vector<string> directory_entries_unix( const string &dir, bool absolute, #endif #ifdef _WIN32 -static vector<string> directory_entries_win32( const string &/*dir*/, bool /*absolute*/, bool /* recursive */ ) +static vector<string> directory_entries_win32( const string &dir, bool absolute, bool recursive ) { vector<string> files; + wstringstream wpath; + wpath << utf8toucs2( dir ) << L"\\*."; + + WIN32_FIND_DATAW fd; + HANDLE h = FindFirstFileW( wpath.str( ).c_str( ), &fd ); + if( h == INVALID_HANDLE_VALUE ) { + DWORD err = GetLastError( ); + if( err == ERROR_NO_MORE_FILES ) { + FindClose( h ); + return files; + } + ostringstream ss; + ss << "FindFirstFileW failed with '" << dir << "': " << getLastError( ); + throw runtime_error( ss.str( ) ); + } + + while( h != INVALID_HANDLE_VALUE ) { + if( ( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) != 0 ) { + if( wcscmp( fd.cFileName, L"." ) == 0 || + wcscmp( fd.cFileName, L".." ) == 0 ) { + goto NEXT; + } + if( recursive ) { + ostringstream ss; + ss << dir << "\\" << wchartoutf8( fd.cFileName ); + vector<string> subfiles = directory_entries_win32( ss.str( ), absolute, recursive ); + files.insert( files.end( ), subfiles.begin( ), subfiles.end( ) ); + } + } else if( ( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == 0 ) { + if( absolute ) { + ostringstream ss; + ss << dir << "\\" << wchartoutf8( fd.cFileName ); + files.push_back( ss.str( ) ); + } else { + files.push_back( string( wchartoutf8( fd.cFileName ) ) ); + } + } +NEXT: + if( !FindNextFileW( h, &fd ) ) { + DWORD err = GetLastError( ); + if( err == ERROR_NO_MORE_FILES ) { + // finish iterating + FindClose( h ); + return files; + } else { + FindClose( h ); + ostringstream ss; + ss << "FindNextFileW failed with '" << dir << "': " << getLastError( ); + throw runtime_error( ss.str( ) ); + } + } + } + + FindClose( h ); + return files; } #endif |