Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

Trying to understand this code

$
0
0
Someone was suggesting I use this code for my file-renaming project. The problem is, I barely understand ANY of it. It looks like the guy tore C++ itself asunder! Here is the monstrosity of code:
#include <Windows.h>
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>

const std::string currentDirectory(".") ;
const std::string previousDirectory("..") ;

class FileIterator
{
public:
    struct FileInfo
    {
        std::string fileName ;
        std::string path ;
    };

    FileIterator( const std::string& path, const std::string& wildcard, const std::vector<std::string>& filters )
        : _filters(filters), _directories(1,path), _wildcard(wildcard), _directoryIndex(0), _startingDirectory(true) 
    {
    }

    bool getNext( FileInfo & f )
    {
        WIN32_FIND_DATA ffd ;
        for ( ; ; )
        {
            if ( _startingDirectory )
            {
                while  (_directoryIndex < _directories.size() && 
                       (_findHandle = FindFirstFile((_directories[_directoryIndex]+_wildcard).c_str(), &ffd)) == INVALID_HANDLE_VALUE )
                {
                    ++_directoryIndex ;
                }

                if ( _findHandle == INVALID_HANDLE_VALUE || _directoryIndex == _directories.size() )
                    return false ;

                _startingDirectory = false ; 

                if ( _shouldReturnFile( ffd ) )
                {
                    f.fileName = ffd.cFileName ;
                    f.path = _directories[_directoryIndex] ;
                    return true ;
                }
            }
            else
            {
                if ( !FindNextFile(_findHandle, &ffd) )
                {
                    _startingDirectory = true ;
                    ++_directoryIndex ;
                }
                else if ( _shouldReturnFile(ffd) )
                {
                    f.fileName = ffd.cFileName ;
                    f.path = _directories[_directoryIndex] ;
                    return true ;
                }
            }
        }
    }


private:

    bool _shouldReturnFile( const WIN32_FIND_DATA& f )
    {
        if ( f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
        {
            if ( !(f.cFileName == currentDirectory || f.cFileName == previousDirectory) )
                _directories.push_back( _directories[_directoryIndex] + f.cFileName + '/' ) ;
            
            return false ;
        }

        return  _matchesFilters(f.cFileName) ;
    }

    bool _matchesFilters( const std::string & s )
    {
        for ( auto& filter : _filters )
        {
            if ( std::string::npos != s.find(filter) )
                return true ;
        }
        return false ;
    }

    std::vector<std::string> _filters ;
    std::vector<std::string> _directories ;
    std::string _wildcard ;

    HANDLE _findHandle ;
    unsigned _directoryIndex ;
    bool _startingDirectory ;
};


int main()
{
    char const* path = "C:/Projects/TestDir/" ;
    char const* wildcard = "*" ;

    char const* filterArray[] = { "+", "%20", "%2b" } ;
    const unsigned filterArraySize = sizeof(filterArray) / sizeof(filterArray[0]) ;

    std::vector<std::string> filters(filterArray, filterArray + filterArraySize);

    FileIterator fileIterator( path, wildcard, filters) ;
    std::unordered_map<std::string, std::vector<std::string>> fileMap ;

    FileIterator::FileInfo fi ;

    while ( fileIterator.getNext(fi) )
        fileMap[fi.path].push_back(fi.fileName) ;

    for ( auto& dir : fileMap )
    {
        std::cout << "Directory: \"" << dir.first << "\"\n" ;
        for ( auto & file : dir.second )
            std::cout << "\t\"" << file << "\"\n" ;
    }
}


Seeing code like this would be like seeing this DMC 4 player in action: https://www.youtube.com/watch?v=pDA_VaDQ02M

Viewing all articles
Browse latest Browse all 51036

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>