/****************************************************************************
*
* 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
}