1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
/******************************************************************************
* SOFA, Simulation Open-Framework Architecture, version 1.0 beta 4 *
* (c) 2006-2009 MGH, INRIA, USTL, UJF, CNRS *
* *
* This library is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. *
* *
* This library 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 Lesser General Public License *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this library; if not, write to the Free Software Foundation, *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
*******************************************************************************
* SOFA :: Framework *
* *
* Authors: M. Adam, J. Allard, B. Andre, P-J. Bensoussan, S. Cotin, C. Duriez,*
* H. Delingette, F. Falipou, F. Faure, S. Fonteneau, L. Heigeas, C. Mendoza, *
* M. Nesme, P. Neumann, J-P. de la Plata Alcade, F. Poyer and F. Roy *
* *
* Contact information: contact@sofa-framework.org *
******************************************************************************/
#ifndef SOFA_HELPER_SYSTEM_FILEREPOSITORY_H
#define SOFA_HELPER_SYSTEM_FILEREPOSITORY_H
#include <string>
#include <vector>
#include <sofa/helper/helper.h>
namespace sofa
{
namespace helper
{
namespace system
{
/// Helper class to find files in a list of directories.
///
/// Each file is searched as follow:
///
/// 1: Using the specified filename in current directory, or in the specified directory.
/// If the filename does not start with "/", "./", or "../" :
/// 2: In the directory path specified using addFirstPath method.
/// 3: In the directory path specified using an environment variable (default to SOFA_DATA_PATH).
/// 4: In the default directories relative to the main executable (default to ../share).
/// 5: In the directory path specified using addLastPath method.
///
/// For file name starting with '/', './' or '../' only the first step is used.
///
/// A path is considered as a concatenation of directories separated by :
// A small utility class to temporarly set the current directory to the same as a specified file
class SOFA_HELPER_API FileRepository
{
public:
/// Initialize the set of paths from an environment variable.
FileRepository(const char* envVar = "SOFA_DATA_PATH", const char* relativePath = "../share" );
~FileRepository();
/// Adds a path to the front of the set of paths.
void addFirstPath(const std::string& path);
/// Adds a path to the back of the set of paths.
void addLastPath(const std::string& path);
/// Get the first path into the set of paths
std::string getFirstPath();
/// Find file using the stored set of paths.
/// @param basedir override current directory (optional)
/// @param filename requested file as input, resolved file path as output
/// @return true if the file was found in one of the directories, false otherwise
bool findFile(std::string& filename, const std::string& basedir="");
/// Alias for findFile, but returning the resolved file as the result.
/// Less informative for errors, but sometimes easier to use
std::string getFile(std::string filename, const std::string& basedir="")
{
findFile(filename, basedir);
return filename;
}
/// Find file using the stored set of paths.
/// @param basefile override current directory by using the parent directory of the given file
/// @param filename requested file as input, resolved file path as output
/// @return true if the file was found in one of the directories, false otherwise
bool findFileFromFile(std::string& filename, const std::string& basefile);
/// Print the list of path to std::cout
void print();
/// OS-dependant character separing entries in list of paths.
static char entrySeparator()
{
#ifdef WIN32
return ';';
#else
return ':';
#endif
}
protected:
/// Vector of paths.
std::vector<std::string> vpath;
/// Search file in a given path.
static bool findFileIn(std::string& filename, const std::string& path);
};
extern SOFA_HELPER_API FileRepository DataRepository; ///< Default repository
} // namespace system
} // namespace helper
} // namespace sofa
#endif
|