/**
 * @file file_manip.h
 * Useful file management helpers
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author Philippe Elie
 * @author John Levon
 */

#ifndef FILE_MANIP_H
#define FILE_MANIP_H

#include <string>
#include <list>


/**
 * copy_file - copy a file or subtree
 * @param source        filename to copy from
 * @param destination   filename to copy into
 *
 * return true if copying successful
 */
bool copy_file(std::string const & source, std::string const & destination);

/// return true if dir is an existing directory
bool is_directory(std::string const & dirname);

/**
 * is_file_identical - check for identical files
 * @param file1  first filename
 * @param file2  second filename
 *
 * return true if the two filenames belong to the same file
 */
bool is_files_identical(std::string const & file1, std::string const & file2);

/**
 * op_realpath - resolve symlinks etc.
 * Resolve a path as much as possible. Accounts for relative
 * paths (from cwd), ".." and ".". For success, the target
 * file must exist !
 *
 * Resolve a symbolic link as far as possible.
 * Returns the original string on failure.
 */
std::string const op_realpath(std::string const & name);

/// return true if the given file is readable
bool op_file_readable(std::string const & file);

/**
 * @param file_list where to store result
 * @param base_dir directory from where lookup start
 * @param filter a filename filter
 * @param recursive if true lookup in sub-directory
 *
 * create a filelist under base_dir, filtered by filter and optionally
 * looking in sub-directory. If we look in sub-directory only sub-directory
 * which match filter are traversed.
 */
bool create_file_list(std::list<std::string> & file_list,
		      std::string const & base_dir,
		      std::string const & filter = "*",
		      bool recursive = false);

/**
 * op_dirname - get the path component of a filename
 * @param file_name  filename
 *
 * Returns the path name of a filename with trailing '/' removed.
 */
std::string op_dirname(std::string const & file_name);

/**
 * op_basename - get the basename of a path
 * @param path_name  path
 *
 * Returns the basename of a path with trailing '/' removed.
 *
 * Always use this instead of the C basename() - header order
 * can affect behaviour  for basename("/")
 */
std::string op_basename(std::string const & path_name);

#endif /* !FILE_MANIP_H */
