VOSM Code
Brought to you by:
jiapei
--- a +++ b/lv_io.cpp @@ -0,0 +1,158 @@ +/**************************************************************************** +* +* Copyright (c) 2006 by JIA Pei, all rights reserved. +* Copyright (c) 2006 by Vision Open: http://www.visionopen.com/ +* +* Author: JIA Pei +* Contact: jp4work@gmail.com +* URL: http://www.visionopen.com/members/jiapei.php +* The author administrates Vision Open -- http://www.visionopen.com +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* for more details. +* +* You should have received a copy of the GNU General Public License along +* with this program; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* This software is partly based on the following open source: +* +* - Boost +* - OpenCV +* +* This software is using IMM Face Database, which can be downloaded from +* http://www2.imm.dtu.dk/~aam/. +* +* M. B. Stegmann, B. K. Ersb{\o}ll, and R. Larsen. FAME - a flexible appearance +* modelling environment. IEEE Trans. on Medical Imaging, 22(10):1319-1331, 2003 +* +****************************************************************************/ + +// $Id: lv_io.cpp,v 1.1.1.1 2006-09-03 17:49:04 JIA Pei Exp $ + + +#include "lv_io.h" + +#include <iostream> +#include <fstream> +#include <string> +#include <boost/filesystem/operations.hpp> // includes boost/filesystem/path.hpp +#include <boost/filesystem/fstream.hpp> // ditto +#include <iostream> // for std::cout +#include <boost/regex/v4/fileiter.hpp> + + +using namespace std; + + + +// local (static) compare function for the qsort() call below +static int str_compare( const void *arg1, const void *arg2 ) +{ + return strcmp( ( *(string*)arg1).c_str (), ( *(string*)arg2).c_str () ); +} + + +/** + + @author JIA Pei + + @version 2006-09-01 + + @brief Scans a directory and sorts all files with a specified extension. + + @param path Path to read from. + + @param extension The file extension to search for. + + @return The filenames found without any path. + +*/ +vector<string> lv_io::ScanNSortDirectory( const string &path, const string &extension ) +{ + boost::re_detail::file_iterator_ref *ref = new boost::re_detail::file_iterator_ref (); + BOOST_REGEX_NOEH_ASSERT(ref); + ref->count = 1; + + string searchPath; + int nbFiles; + vector<string> vFilenames; + + // add termination backslash (if needed) + string pathBS = lv_io::AddBackSlash(path); + + // build and sort list of filenames + searchPath = pathBS + string("*.") + extension; + + ref->hf = FindFirstFileA(searchPath.c_str (), &(ref->_data)); + + vFilenames.push_back( pathBS+string(ref->_data.cFileName) ); + nbFiles=1; + while( FindNextFileA ( ref->hf, &(ref->_data) ) ) + { + vFilenames.push_back( pathBS+string(ref->_data.cFileName) ); + nbFiles++; + } + FindClose( ref->hf ); + + // sort the filenames + qsort( (void *)&(vFilenames[0]), (size_t)nbFiles, sizeof( string), str_compare ); + + // return + return vFilenames; +} + + + +/** + + @author JIA Pei + + @version 2006-09-01 + + @brief Ensures that a string is terminated with a backslash. + If the already has a terminating backslash, nothing is done. + + @param path Input string. + + @return Backslash-terminated output string. + +*/ +string lv_io::AddBackSlash( const string &path ) +{ + int len = path.length(); + + // For Windows + #ifdef BOOST_REGEX_FI_WIN32_MAP + { + if (len <= 0 || (len>0 && path[len-1]=='\\')) + { + return path; + } + else + { + return path+"\\"; + } + } + + // For Posix -- Portable Operating System Interface for uniX + #elif defined(BOOST_REGEX_FI_POSIX_MAP) + { + if (len <= 0 || (len>0 && path[len-1]=='/')) + { + return path; + } + else + { + return path+"/"; + } + } + #endif +} +