DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
OksSystem::File Class Reference

Wrapper for file operations. More...

#include <File.hpp>

Inheritance diagram for OksSystem::File:
[legend]

Public Types

typedef std::vector< OksSystem::Filefile_list_t

Public Member Functions

 File (const std::string &name)
 File (const char *name)
 File (const File &other)
virtual ~File ()
 operator std::string () const throw ()
 operator const char * () const throw ()
 operator bool () const throw ()
bool equals (const File &other) const throw ()
 compare two files *‍/
 operator size_t () const
const std::string & full_name () const throw ()
 full name for file *‍/
const char * c_full_name () const throw ()
std::string short_name () const throw ()
 short name for file *‍/
std::string parent_name () const throw ()
 path of directory containing file *‍/
std::string extension () const throw ()
 extension for file *‍/
int depth () const throw ()
 depth of the file *‍/
OksSystem::File parent () const
 parent of the current file *‍/
OksSystem::File child (const std::string &name) const
 named child of the current directory *‍/
OksSystem::File temporary (const std::string &prefix) const
bool exists () const throw ()
 does the file exist *‍/
mode_t permissions () const
 permissions for the file *‍/
std::string pretty_permissions () const
 pretty permissions for the file *‍/
size_t size () const
 size of file *‍/
uid_t owner_id () const
 owner id of file *‍/
User owner () const
 owner of the file *‍/
gid_t group () const
 group of file *‍/
bool is_regular () const
 is the file a directory *‍/
bool is_directory () const
 is the file a regular file *‍/
bool is_fifo () const
 is the file a named pipe *‍/
std::string file_type () const
 type of the file *‍/
file_list_t directory () const
 list of file in directory *‍/
void unlink () const
 deletes (unlinks) file *‍/
void rmdir () const
 deletes directory *‍/
void remove () const
 recursively delete files and directories *‍/
void rename (const File &other) const
 rename or moves the file *‍/
void permissions (mode_t permissions) const
 sets the type of the file *‍/
void make_dir (mode_t permissions) const
 creates a directory *‍/
void make_path (mode_t permissions) const
 creates a full path *‍/
void make_fifo (mode_t permissions) const
 creates a FIFO (named pipe) *‍/
void ensure_path (mode_t permissions) const
 creates the parent path *‍/
std::istream * input () const
 returns an input stream from the file*‍/
std::ostream * output (bool append=false) const
 returns an output stream to the file*‍/

Static Public Member Functions

static std::string protocol (const std::string &url) throw ()
 extracts the protocol part of an url *‍/
static std::string extension (const std::string &url) throw ()
 extracts the extension of a path or an url *‍/
static std::string uri (const std::string &url) throw ()
 extracts the local path of an url *‍/
static std::string short_name (const std::string &url) throw ()
 extracts the short file name of an url *‍/
static int depth (const std::string &path) throw ()
 calculates depth of a path *‍/
static std::string first_line (const std::string &text)
 extracts the first line of a text *‍/
static File from_url (const std::string &url)
 build a file out of an URL *‍/
static std::string working_directory ()
 current directory of process *‍/
static void working_directory (const File &dir)
 set working directory of process *‍/
static std::string expand_home (const std::string path)
 resolve home directory *‍/
static std::string pretty_permissions (mode_t permissions)
 pretty prints permissions *‍/
static std::string to_string (mode_t permissions) throw ()
 converts permission to string *‍/
static std::string pretty_open_flag (int flags)
 pretty prints open flags *‍/
static std::string pretty_size (size_t size, bool cut_small)
 pretty prints a file size *‍/

Static Public Attributes

static const char *const FILE_FLAG_STR = "-rwxS"
 column headers for display of permissions *‍/
static const char *const FILE_PROTOCOL = "file"
 string for the file protocol *‍/

Protected Member Functions

void set_name (const std::string &name)
 sets the name of the file *‍/
mode_t get_mode () const
 get mode associated with file (permission + type) *‍/

Static Protected Member Functions

static int unit (int u)
 calculates the value of a computer unit of order n (i.e KB,GB, etc *‍/

Protected Attributes

std::string m_full_name
 full name (path) of the file *‍/

Static Protected Attributes

static const char *const HUMAN_SIZE_STR [] = { "B", "KB", "MB", "GB" }
 strings for pretty printing file sizes *‍/
static const char *const HUMAN_OPEN_STR [] = { "READ", "WRITE", "NOBLOCK", "APPEND", "CREATE", "TRUNCATE","EXCLUSIVE" }
 strings for pretty printing open flags *‍/
static const int KILOBYTE = 1024
 number of bytes in a kilobyte *‍/
static const char *const FILE_COMMAND_PATH = "/usr/bin/file"

Detailed Description

Wrapper for file operations.

This class represents a file. it provides tools to manipulate files in a simple way. All methods throw ers issues in case of error. Internally, files are handled as canonical paths i.e with ./ ../ and symlinks resolved.

Author
Matthias Wiesmann
Version
1.1

Definition at line 37 of file File.hpp.

Member Typedef Documentation

◆ file_list_t

Definition at line 39 of file File.hpp.

Constructor & Destructor Documentation

◆ File() [1/3]

OksSystem::File::File ( const std::string & name)

Constructor

Note
This method does not create a file, it simply builds an object describing a file

Definition at line 301 of file File.cpp.

301 {
302 set_name(name);
303} // File
void set_name(const std::string &name)
sets the name of the file *‍/
Definition File.cpp:385

◆ File() [2/3]

OksSystem::File::File ( const char * c_name)

Constructor This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Definition at line 309 of file File.cpp.

309 {
310 ERS_PRECONDITION(c_name);
311 std::string name = std::string(c_name);
312 set_name(name);
313} // File
#define ERS_PRECONDITION(expression)

◆ File() [3/3]

OksSystem::File::File ( const File & other)

Constructor This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Definition at line 319 of file File.cpp.

319 {
320 set_name(other.m_full_name);
321} // File

◆ ~File()

virtual OksSystem::File::~File ( )
inlinevirtual

Definition at line 74 of file File.hpp.

74{}

Member Function Documentation

◆ c_full_name()

const char * OksSystem::File::c_full_name ( ) const
throw ( )
Returns
the full (absolute) path of the file

Definition at line 417 of file File.cpp.

417 {
418 return m_full_name.c_str();
419} // c_full_name
std::string m_full_name
full name (path) of the file *‍/
Definition File.hpp:41

◆ child()

OksSystem::File OksSystem::File::child ( const std::string & name) const

named child of the current directory *‍/

Definition at line 455 of file File.cpp.

455 {
456 std::string child_name = m_full_name + "/" + name;
457 return OksSystem::File(child_name);
458} // child

◆ depth() [1/2]

int OksSystem::File::depth ( ) const
throw ( )

depth of the file *‍/

Definition at line 445 of file File.cpp.

445 {
446 return depth(m_full_name);
447} // depth
int depth() const
depth of the file *‍/
Definition File.cpp:445

◆ depth() [2/2]

int OksSystem::File::depth ( const std::string & path)
throw ( )
static

calculates depth of a path *‍/

Calculates the depth of a file. This depth is the number of parent directories. Files in the root directory have depht of 0, other files have a depth of their parent's depth + 1

Parameters
pathto analyze
Returns
depth or -1 if the format of the path is not understood.

Definition at line 121 of file File.cpp.

121 {
122 if (path[0] == SLASH_CHAR) {
123 int count = 0;
124 std::string rest = path.substr(1);
125 while(! rest.empty()) {
126 std::string::size_type slash = rest.find(SLASH_CHAR);
127 if (slash==std::string::npos) return count;
128 count++;
129 rest = rest.substr(slash+1);
130 } // while
131 return count;
132 } // path with slash
133 if (protocol(path) == FILE_PROTOCOL) {
134 return depth(uri(path));
135 } //
136 return -1;
137} // depth
#define SLASH_CHAR
Definition File.cpp:53
static std::string protocol(const std::string &url)
extracts the protocol part of an url *‍/
Definition File.cpp:71
static std::string uri(const std::string &url)
extracts the local path of an url *‍/
Definition File.cpp:106
static const char *const FILE_PROTOCOL
string for the file protocol *‍/
Definition File.hpp:51

◆ directory()

OksSystem::File::file_list_t OksSystem::File::directory ( ) const

list of file in directory *‍/

Builds a vector containing all the files contained in a directory

Returns
a vector of files contained in the directory
Exceptions
OksSystem::OpenFailif the directory could not be openend
OksSystem::CloseFailif the directory cannot be closed

Definition at line 619 of file File.cpp.

619 {
620 file_list_t file_vector;
621 DIR* directory_ptr = opendir(m_full_name.c_str());
622 if (! directory_ptr) {
623 std::string message = "on directory " + m_full_name;
624 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "opendir", message.c_str() );
625 }
626 while(true) {
627 struct dirent* directory_entry = readdir(directory_ptr);
628 if (directory_entry) {
629 const std::string name = directory_entry->d_name;
630 if ((name!=".") && (name!="..")) {
631 std::string path = m_full_name + "/" + name;
632 OksSystem::File file(path);
633 file_vector.push_back(file);
634 } // if
635 } else {
636 break;
637 } // if / else
638 } // while
639 int status = closedir(directory_ptr);
640 if (status<0) {
641 std::string message = "on directory " + m_full_name;
642 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "closedir", message.c_str() );
643 }
644 return file_vector;
645} // directory
#define ERS_HERE
std::vector< OksSystem::File > file_list_t
Definition File.hpp:39
Only Configuration DB opened by rdbconfig or oksconflibs plug in can be message

◆ ensure_path()

void OksSystem::File::ensure_path ( mode_t perm) const

creates the parent path *‍/

Makes sure that the path for a file exists This is done by calling make_path on the parent directory

Parameters
permissionspermissions used to create directories
See also
OksSystem::File::make_path()

Definition at line 781 of file File.cpp.

781 {
782 const File father = parent();
783 father.make_path(perm);
784} // ensure_path
OksSystem::File parent() const
parent of the current file *‍/
Definition File.cpp:451
File(const std::string &name)
Definition File.cpp:301

◆ equals()

bool OksSystem::File::equals ( const File & other) const
throw ( )

compare two files *‍/

Comparison operator As path are canonicalized, we simply compare the full paths.

Parameters
otherfile to compare this file to
Returns
true if both file are equal
Note
This comparison method does not taken hard links into account

Definition at line 352 of file File.cpp.

352 {
353 return (m_full_name == other.m_full_name);
354} // operator==

◆ exists()

bool OksSystem::File::exists ( ) const
throw ( )

does the file exist *‍/

Checks if the file exists in the fileOksSystem

Returns
true if the file exists, false otherwise
Exceptions
ers::IOIssueif an error occurs

Definition at line 477 of file File.cpp.

477 {
478 struct stat file_status;
479 const int result = stat(m_full_name.c_str(),&file_status);
480 if (0==result) return true;
481 return false;
482} // exists

◆ expand_home()

std::string OksSystem::File::expand_home ( const std::string path)
static

resolve home directory *‍/

Expands a file containing a home directory reference (~user).

Definition at line 190 of file File.cpp.

190 {
191 ERS_PRECONDITION(! path.empty());
192 ERS_PRECONDITION(path[0] == '~');
193 std::string::size_type slash = path.find('/');
194 const std::string user_name = path.substr(1,slash-1);
195 const std::string rest_path = path.substr(slash);
196 OksSystem::User user;
197 if (! user_name.empty()) {
198 user = OksSystem::User(user_name);
199 }
200 return user.home() + rest_path;
201} // home_directory
const std::string & home() const
home directory name
Definition User.cpp:218

◆ extension() [1/2]

std::string OksSystem::File::extension ( ) const
throw ( )

extension for file *‍/

Returns
the extension of the file

Definition at line 441 of file File.cpp.

441 {
442 return extension(m_full_name);
443} // extension
std::string extension() const
extension for file *‍/
Definition File.cpp:441

◆ extension() [2/2]

std::string OksSystem::File::extension ( const std::string & url)
throw ( )
static

extracts the extension of a path or an url *‍/

Extracts the extension of an url or path

Parameters
urlan url or file path
Returns
the extension (without the dot) or an empty string

Definition at line 82 of file File.cpp.

82 {
83 std::string::size_type dot = url.rfind(DOT_CHAR);
84 if (dot==std::string::npos) return std::string();
85 return url.substr(dot+1);
86} // extension
#define DOT_CHAR
Definition File.cpp:55

◆ file_type()

std::string OksSystem::File::file_type ( ) const

type of the file *‍/

Definition at line 605 of file File.cpp.

605 {
606 OksSystem::Executable file_command(FILE_COMMAND_PATH);
608 params.push_back("-b");
609 params.push_back(full_name());
610 return first_line(file_command.pipe_in(params));
611} // file_type
std::vector< std::string > param_collection
static std::string first_line(const std::string &text)
extracts the first line of a text *‍/
Definition File.cpp:144
static const char *const FILE_COMMAND_PATH
Definition File.hpp:48
const std::string & full_name() const
full name for file *‍/
Definition File.cpp:411

◆ first_line()

std::string OksSystem::File::first_line ( const std::string & text)
static

extracts the first line of a text *‍/

Extracts the first line of a text

Parameters
textthe text to process
Returns
the first line of the text

Definition at line 144 of file File.cpp.

144 {
145 std::string::size_type nl = text.find('\n');
146 if (nl>0) return text.substr(0,nl);
147 return text;
148} // first_line

◆ from_url()

OksSystem::File OksSystem::File::from_url ( const std::string & url)
static

build a file out of an URL *‍/

Builds a File object ou of an url

Parameters
urlthe url, it must start with the file protocol
Returns
a File object

Definition at line 156 of file File.cpp.

156 {
157 std::string prot = protocol(url);
159 const std::string path = uri(url);
160 return File(path);
161} // from_url

◆ full_name()

const std::string & OksSystem::File::full_name ( ) const
throw ( )

full name for file *‍/

Returns
the full (absolute) path of the file

Definition at line 411 of file File.cpp.

411 {
412 return m_full_name;
413} // full_name

◆ get_mode()

mode_t OksSystem::File::get_mode ( ) const
protected

get mode associated with file (permission + type) *‍/

Extracts the mode information of the file. This is used to determine both the file type and the file permissions

Returns
the mode of the file
Exceptions
OksSystem::FStatFailif fstat fails

Definition at line 490 of file File.cpp.

490 {
491 struct stat file_status;
492 const int result = stat(m_full_name.c_str(),&file_status);
493 if (0==result) {
494 return file_status.st_mode;
495 } // if
496 std::string message = "on file/directory " + m_full_name;
497 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "stat", message.c_str() );
498} // mode

◆ group()

gid_t OksSystem::File::group ( ) const

group of file *‍/

Returns
the group-id of the group of the file
Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 564 of file File.cpp.

564 {
565 struct stat file_status;
566 const int result = stat(m_full_name.c_str(),&file_status);
567 if (0==result) return file_status.st_gid;
568 std::string message = "on file/directory " + m_full_name;
569 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "stat", message.c_str() );
570} // owner

◆ input()

std::istream * OksSystem::File::input ( ) const

returns an input stream from the file*‍/

Conversion into a input stream pointer This actually creates a new input stream that reads from the file.

Returns
a dynamically allocated input stream
Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 820 of file File.cpp.

820 {
821 try {
822 std::ifstream *stream = new std::ifstream(m_full_name.c_str());
823 stream->exceptions(std::ios::failbit | std::ios::badbit);
824 return stream;
825 } catch (std::ios_base::failure &ex) {
826 throw OksSystem::OpenFileIssue( ERS_HERE, errno, m_full_name.c_str(), ex );
827 } // catch
828} // std::istream*

◆ is_directory()

bool OksSystem::File::is_directory ( ) const

is the file a regular file *‍/

Checks if the file a directory

Returns
true if the file is a directory
Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 589 of file File.cpp.

589 {
590 const mode_t mode = get_mode();
591 return (mode & S_IFDIR);
592} // is_regular
mode_t get_mode() const
get mode associated with file (permission + type) *‍/
Definition File.cpp:490

◆ is_fifo()

bool OksSystem::File::is_fifo ( ) const

is the file a named pipe *‍/

Checks if the file a named pipe (FIFO)

Returns
true if the file is named pipe (FIFO)
Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 599 of file File.cpp.

599 {
600 const mode_t mode = get_mode();
601 return (mode & S_IFIFO);
602} // is_pipe

◆ is_regular()

bool OksSystem::File::is_regular ( ) const

is the file a directory *‍/

Checks if the file a regular file (i.e not a directory, named pipe or anything else).

Returns
true if the file is regular
Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 578 of file File.cpp.

578 {
579 const mode_t mode = get_mode();
580 return (mode & S_IFREG);
581} // is_regular

◆ make_dir()

void OksSystem::File::make_dir ( mode_t perm) const

creates a directory *‍/

Creates a directory The current object is taken as the name of the directory to create.

Parameters
permthe permissions to associate with the directory
Note
if the directory exists, the method attempts to do a chmod to match the permissions

Definition at line 722 of file File.cpp.

722 {
723
724 errno = 0;
725 const int result = ::mkdir(m_full_name.c_str(),perm);
726 int mkdir_error = errno;
727
728 if (0==result) {
729 try {
730 permissions(perm);
731 }
732 catch (OksSystem::OksSystemCallIssue &e){
733 std::string message = "on directory " + m_full_name;
734 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "mkdir -> chmod", message.c_str() );
735 }
736 return;
737 } else {
738 if (exists()) {
739 if (is_directory()) { // already exists we attempt a chmod
740 try {
741 permissions(perm);
742 }
743 catch (OksSystem::OksSystemCallIssue &e){
744 // ignore this case...
745 }
746 return;
747 } // is directory
748 } else { // exists
749 std::string message = "on directory " + m_full_name;
750 throw OksSystem::OksSystemCallIssue(ERS_HERE, mkdir_error, "mkdir", message.c_str());
751 }
752 }
753
754} // makedir
bool is_directory() const
is the file a regular file *‍/
Definition File.cpp:589
bool exists() const
does the file exist *‍/
Definition File.cpp:477
mode_t permissions() const
permissions for the file *‍/
Definition File.cpp:505

◆ make_fifo()

void OksSystem::File::make_fifo ( mode_t perm) const

creates a FIFO (named pipe) *‍/

Creates a named pipe (FIFO)

Parameters
permthe permission to give the pipe

Definition at line 791 of file File.cpp.

791 {
792 if (exists()) {
793 if (is_fifo()) {
794 if(perm != permissions()) {
795 permissions(perm);
796 return;
797 } else {
798 return;
799 }
800 } // is_fifo
801 } // exists
802 const int status = ::mkfifo(m_full_name.c_str(),perm);
803 if (status==0) {
804 permissions(perm);
805 return;
806 }
807 std::string message = "while creating FIFO " + m_full_name;
808 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "mkfifo", message.c_str() );
809} // makefifo
bool is_fifo() const
is the file a named pipe *‍/
Definition File.cpp:599

◆ make_path()

void OksSystem::File::make_path ( mode_t perm) const

creates a full path *‍/

Builds a full path. The current object is taken as the name of a directory to create. This method creates all the parent directories as needed

Parameters
permissionsthe permissions to associate with the directory
Note
If parent directories are created, their permissions will be those defined in permissions ORed with 0700. This is needed to ensure we can actually write into the directories we create.

Definition at line 766 of file File.cpp.

766 {
767 const File father = parent();
768 if (! father.exists()) {
769 mode_t father_permission = perm | S_IRWXU;// we need rights to write sons
770 father.make_path(father_permission);
771 } // if
772 make_dir(perm);
773} // makepath
void make_dir(mode_t permissions) const
creates a directory *‍/
Definition File.cpp:722

◆ operator bool()

OksSystem::File::operator bool ( ) const
throw ( )

Cast to boolean, checks if the file exists

Returns
true if the file exists

Definition at line 341 of file File.cpp.

341 {
342 return exists();
343} // operator bool

◆ operator const char *()

OksSystem::File::operator const char * ( ) const
throw ( )

Definition at line 333 of file File.cpp.

333 {
334 return m_full_name.c_str();
335} // operator const char*

◆ operator size_t()

OksSystem::File::operator size_t ( ) const

Cast to size type

Returns
the size of the file
See also
size()

Definition at line 361 of file File.cpp.

361 {
362 return size();
363} // operator size_t
size_t size() const
size of file *‍/
Definition File.cpp:535

◆ operator std::string()

OksSystem::File::operator std::string ( ) const
throw ( )

Definition at line 329 of file File.cpp.

329 {
330 return m_full_name;
331} // operator std::string

◆ output()

std::ostream * OksSystem::File::output ( bool append = false) const

returns an output stream to the file*‍/

Conversion into an output stream pointer This actually creates a new output stream that writes to the file.

Returns
a dynamically allocated output stream
Parameters
appendis the file opened in append mode
Exceptions
ers::IOIssueif an error occurs

Definition at line 837 of file File.cpp.

837 {
838 try {
839 std::ios::openmode mode = std::ios::out;
840 if (append) {
841 mode |= std::ios::app;
842 }
843 std::ofstream *stream = new std::ofstream(m_full_name.c_str(),mode);
844 stream->exceptions(std::ios::failbit | std::ios::badbit);
845 return stream;
846 } catch (std::ios_base::failure &ex) {
847 throw OksSystem::OpenFileIssue( ERS_HERE, errno, m_full_name.c_str(), ex );
848 } // catch
849} // std::ostream*

◆ owner()

OksSystem::User OksSystem::File::owner ( ) const

owner of the file *‍/

Definition at line 555 of file File.cpp.

555 {
556 return User(owner_id());
557} // owner
uid_t owner_id() const
owner id of file *‍/
Definition File.cpp:547

◆ owner_id()

uid_t OksSystem::File::owner_id ( ) const

owner id of file *‍/

Returns
the user-id of the owner of the file
Exceptions
OksSystem::IOIssueif an error occurs or the file does not exist

Definition at line 547 of file File.cpp.

547 {
548 struct stat file_status;
549 const int result = stat(m_full_name.c_str(),&file_status);
550 if (0==result) return file_status.st_uid;
551 std::string message = "on file/directory " + m_full_name;
552 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "stat", message.c_str() );
553} // owner_id

◆ parent()

OksSystem::File OksSystem::File::parent ( ) const

parent of the current file *‍/

Returns
the parent directory

Definition at line 451 of file File.cpp.

451 {
452 return File(parent_name());
453} // parent
std::string parent_name() const
path of directory containing file *‍/
Definition File.cpp:432

◆ parent_name()

std::string OksSystem::File::parent_name ( ) const
throw ( )

path of directory containing file *‍/

Finds the name of the enclosing directory

Returns
the path of the directory containing the file

Definition at line 432 of file File.cpp.

432 {
433 std::string::size_type size = m_full_name.size();
434 std::string::size_type slash = m_full_name.rfind(SLASH_CHAR,size-1);
435 if (slash==std::string::npos || slash==0) return ("/");
436 return m_full_name.substr(0,slash);
437} // directory

◆ permissions() [1/2]

mode_t OksSystem::File::permissions ( ) const

permissions for the file *‍/

Returns
the permissions for the file
Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 505 of file File.cpp.

505 {
506 mode_t mode = get_mode();
507 return (mode & 07777);
508} // permissions

◆ permissions() [2/2]

void OksSystem::File::permissions ( mode_t perm) const

sets the type of the file *‍/

Sets the permissions of the file

Parameters
permissionsthe new permissions
Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 704 of file File.cpp.

704 {
705 if(perm != permissions()) {
706 const int result = ::chmod(m_full_name.c_str(),perm);
707 if (0==result) {
708 return;
709 }
710 std::string message = "on file/directory " + m_full_name;
711 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "chmod", message.c_str());
712 }
713} // permissions

◆ pretty_open_flag()

std::string OksSystem::File::pretty_open_flag ( int flags)
static

pretty prints open flags *‍/

Builds a prettyfied version of flags used by the open OksSystem call

Parameters
flagsas passed to open
Returns
a string containing the beautified flags
Note
This method only handles flags available accross plateforms.

Definition at line 232 of file File.cpp.

232 {
233 std::ostringstream flag_str;
234 if (flags & O_WRONLY) {
235 flag_str << HUMAN_OPEN_STR[1];
236 } else if (flags & O_RDWR) {
237 flag_str << HUMAN_OPEN_STR[0] << "-" << HUMAN_OPEN_STR[1];
238 } else {
239 flag_str << HUMAN_OPEN_STR[0];
240 }
241 if (flags & O_NONBLOCK) {
242 flag_str << "/" << HUMAN_OPEN_STR[2];
243 }
244 if (flags & O_APPEND) {
245 flag_str << "/" << HUMAN_OPEN_STR[3];
246 }
247 if (flags & O_CREAT) {
248 flag_str << "/" << HUMAN_OPEN_STR[4];
249 }
250 if (flags & O_TRUNC) {
251 flag_str << "/" << HUMAN_OPEN_STR[5];
252 }
253 if (flags & O_EXCL) {
254 flag_str << "/" << HUMAN_OPEN_STR[6];
255 }
256 flag_str << "(" << flags << ")";
257 return flag_str.str();
258} // pretty_open_permission
static const char *const HUMAN_OPEN_STR[]
strings for pretty printing open flags *‍/
Definition File.hpp:41

◆ pretty_permissions() [1/2]

std::string OksSystem::File::pretty_permissions ( ) const

pretty permissions for the file *‍/

Returns
the prettfied permissions for the file
Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 514 of file File.cpp.

514 {
516} // pretty_permissions
std::string pretty_permissions() const
pretty permissions for the file *‍/
Definition File.cpp:514

◆ pretty_permissions() [2/2]

std::string OksSystem::File::pretty_permissions ( mode_t permissions)
static

pretty prints permissions *‍/

Builds a prettyfied version of permissions. This should look similar to what ls returns with the -l flag

Parameters
permissionsthe permission to beautify
Returns
a string containing the beautified permissions

Definition at line 210 of file File.cpp.

210 {
211 char buffer[11];
212 buffer[0] = (permissions & S_ISUID) ? SETUID_CHAR_CODE : NOTHING_CHAR_CODE;
213 buffer[1] = (permissions & S_IRUSR) ? READ_CHAR_CODE : NOTHING_CHAR_CODE;
214 buffer[2] = (permissions & S_IWUSR) ? WRITE_CHAR_CODE : NOTHING_CHAR_CODE;
215 buffer[3] = (permissions & S_IXUSR) ? EXECUTE_CHAR_CODE : NOTHING_CHAR_CODE;
216 buffer[4] = (permissions & S_IRGRP) ? READ_CHAR_CODE : NOTHING_CHAR_CODE;
217 buffer[5] = (permissions & S_IWGRP) ? WRITE_CHAR_CODE : NOTHING_CHAR_CODE;
218 buffer[6] = (permissions & S_IXGRP) ? EXECUTE_CHAR_CODE : NOTHING_CHAR_CODE;
219 buffer[7] = (permissions & S_IROTH) ? READ_CHAR_CODE : NOTHING_CHAR_CODE;
220 buffer[8] = (permissions & S_IWOTH) ? WRITE_CHAR_CODE : NOTHING_CHAR_CODE;
221 buffer[9] = (permissions & S_IXOTH) ? EXECUTE_CHAR_CODE : NOTHING_CHAR_CODE;
222 buffer[10] = '\0';
223 return std::string(buffer);
224} // pretty_permissions
#define SETUID_CHAR_CODE
Definition File.cpp:51
#define NOTHING_CHAR_CODE
Definition File.cpp:50
#define WRITE_CHAR_CODE
Definition File.cpp:48
#define EXECUTE_CHAR_CODE
Definition File.cpp:49
#define READ_CHAR_CODE
Definition File.cpp:47

◆ pretty_size()

std::string OksSystem::File::pretty_size ( size_t size,
bool cut_small )
static

pretty prints a file size *‍/

Builds a human readable textual description of a file size. The file size is expressed in Gigabytes (GB), Megabytes (MB) and Kilobytes (KB) and Bytes (B).

Parameters
sizethe size of the file
cut_smallshould the display only contain the highest quantity? For example if a file is 1 gigabyte and 20 bytes, if cut_small is true, then the 20 bytes are ignored.
Returns
a string containing the textual description

Definition at line 276 of file File.cpp.

276 {
277 if (0==size) return "0";
278 std::ostringstream size_str;
279 bool writen_something = false;
280 for(int i=3;i>=0;i--) {
281 const unsigned int size_unit = unit(i);
282 if (size > size_unit && ! (cut_small && writen_something)) {
283 const int amount = size / size_unit;
284 size = size % size_unit;
285 size_str << amount << SPACE_CHAR << HUMAN_SIZE_STR[i];
286 writen_something = true;
287 } // if unit is present
288 } // loop
289 return size_str.str();
290} // pretty_size
#define SPACE_CHAR
Definition File.cpp:38
static int unit(int u)
calculates the value of a computer unit of order n (i.e KB,GB, etc *‍/
Definition File.cpp:261
static const char *const HUMAN_SIZE_STR[]
strings for pretty printing file sizes *‍/
Definition File.hpp:40

◆ protocol()

std::string OksSystem::File::protocol ( const std::string & url)
throw ( )
static

extracts the protocol part of an url *‍/

Extracts the protocol part of an url. The protocol part is everything until the colon (:)

Parameters
urlan url
Returns
the protocol part of an empty string

Definition at line 71 of file File.cpp.

71 {
72 std::string::size_type colon = url.find(COLON_CHAR);
73 if (colon==std::string::npos) return std::string();
74 return url.substr(0,colon);
75} // protocol
#define COLON_CHAR
Definition File.cpp:54

◆ remove()

void OksSystem::File::remove ( ) const

recursively delete files and directories *‍/

Recursively delete files and directories. If the file is a directory, all its child are deleted recursively.

Exceptions
OksSystem::UnlinkFailif unlink fails

Definition at line 670 of file File.cpp.

670 {
671 if (is_directory()) {
672 file_list_t childs = directory();
673 for (file_list_t::const_iterator p=childs.begin();p!=childs.end();p++) {
674 const File f = *p;
675 if(f.exists()) {
676 f.remove();
677 }
678 } // for
679 rmdir();
680 } else {
681 unlink();
682 }
683} // remove
void unlink() const
deletes (unlinks) file *‍/
Definition File.cpp:651
void rmdir() const
deletes directory *‍/
Definition File.cpp:657
file_list_t directory() const
list of file in directory *‍/
Definition File.cpp:619

◆ rename()

void OksSystem::File::rename ( const File & other) const

rename or moves the file *‍/

Renames or moves a file.

Parameters
new_namethe new name of the file
Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 691 of file File.cpp.

691 {
692 const char *source = c_full_name() ;
693 const char *dest = other.c_full_name();
694 const int result = ::rename(source,dest);
695 if (0==result) return;
696 throw OksSystem::RenameFileIssue( ERS_HERE, errno, source, dest );
697} // rename
void rename(const File &other) const
rename or moves the file *‍/
Definition File.cpp:691
const char * c_full_name() const
Definition File.cpp:417

◆ rmdir()

void OksSystem::File::rmdir ( ) const

deletes directory *‍/

Definition at line 657 of file File.cpp.

657 {
658 const int result = ::rmdir(m_full_name.c_str());
659 if (0==result) return;
660 std::string message = "on directory " + m_full_name;
661 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "rmdir", message.c_str() );
662} // rmdir

◆ set_name()

void OksSystem::File::set_name ( const std::string & name)
protected

sets the name of the file *‍/

Sets the name for a file. The path name is first expanded and the canonlicalized. Expension means the following

  • If the path starts with / nothing is done
  • If the path starts with ~ the username is resolved and the path starts from there
  • If the path starts with any other character, the working directory is prepended.

The path is then made canonical, this implies removing all ./ and ../ sequences, and resolving all symbolic links.

Parameters
namethe name of the file

Definition at line 385 of file File.cpp.

385 {
386 ERS_PRECONDITION(! name.empty());
387 const char c = name[0];
388 std::string long_path;
389 switch (c) {
390 case '/' :
391 long_path = name;
392 break;
393 case '~' :
394 long_path = expand_home(name);
395 break;
396 default:
397 long_path = working_directory() + "/" + name;
398 break;
399 } // switch
400 char buffer[PATH_MAX];
401 const char* result = realpath(long_path.c_str(),buffer);
402 if (result==0) { // could not resolve path
403 m_full_name = long_path;
404 } else { // we could canonicalize the path
405 m_full_name = buffer;
406 } //
407} // set_name
static std::string working_directory()
current directory of process *‍/
Definition File.cpp:165
static std::string expand_home(const std::string path)
resolve home directory *‍/
Definition File.cpp:190

◆ short_name() [1/2]

std::string OksSystem::File::short_name ( ) const
throw ( )

short name for file *‍/

Returns
the short name of the file - that is the name of the file in its directory

Definition at line 424 of file File.cpp.

424 {
425 return short_name(m_full_name);
426} // short_name
std::string short_name() const
short name for file *‍/
Definition File.cpp:424

◆ short_name() [2/2]

std::string OksSystem::File::short_name ( const std::string & url)
throw ( )
static

extracts the short file name of an url *‍/

Extracts the short file name of an url or path

Parameters
urlan url or file path
Returns
the short name or the full url if it cannot be found

Definition at line 93 of file File.cpp.

93 {
94 std::string::size_type slash = url.rfind(SLASH_CHAR);
95 if (slash==std::string::npos) return url;
96 return url.substr(slash+1);
97} // extension

◆ size()

size_t OksSystem::File::size ( ) const

size of file *‍/

Returns
the size (in bytes) of the file
Exceptions
OksSystem::IOIssueif an error occurs or the file does not exist

Definition at line 535 of file File.cpp.

535 {
536 struct stat file_status;
537 const int result = stat(m_full_name.c_str(),&file_status);
538 if (0==result) return file_status.st_size;
539 std::string message = "on file/directory " + m_full_name;
540 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "stat", message.c_str() );
541} // size

◆ temporary()

OksSystem::File OksSystem::File::temporary ( const std::string & prefix) const

Definition at line 460 of file File.cpp.

460 {
461 char *tmp_name = tempnam(m_full_name.c_str(),prefix.c_str());
462 if ( !tmp_name ) {
463 std::string message = "while creating a valid filename in directory " + m_full_name;
464 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "tempnam", message.c_str() );
465 }
466 OksSystem::File tmp_file(tmp_name);
467 free(tmp_name);
468 return tmp_file;
469} // temporary

◆ to_string()

std::string OksSystem::File::to_string ( mode_t permissions)
throw ( )
static

converts permission to string *‍/

Converts permissions into a string

Parameters
permissionsthe permissions
Returns
a string contaning the permissions in octal form

Definition at line 523 of file File.cpp.

523 {
524 std::ostringstream stream;
525 stream.setf(std::ios::oct,std::ios::basefield);
526 stream << permissions;
527 return stream.str();
528} // to_string

◆ unit()

int OksSystem::File::unit ( int u)
staticprotected

calculates the value of a computer unit of order n (i.e KB,GB, etc *‍/

Definition at line 261 of file File.cpp.

261 {
262 ERS_PRECONDITION(u >= 0);
263 if (u==0) return 1;
264 return KILOBYTE * unit(u-1);
265} // unit
static const int KILOBYTE
number of bytes in a kilobyte *‍/
Definition File.hpp:45

◆ unlink()

void OksSystem::File::unlink ( ) const

deletes (unlinks) file *‍/

Unlinks (i.e deletes) a file.

Exceptions
ers::IOIssueif an error occurs or the file does not exist

Definition at line 651 of file File.cpp.

651 {
652 const int result = ::unlink(m_full_name.c_str());
653 if (0==result) return;
654 throw OksSystem::RemoveFileIssue( ERS_HERE, errno, m_full_name.c_str() );
655} //unlink

◆ uri()

std::string OksSystem::File::uri ( const std::string & url)
throw ( )
static

extracts the local path of an url *‍/

Extacts the uri part of an url. The uri of an url is everything except the protocol part In the case of file or http urls, the uri is the local path

Parameters
urlan url
Returns
the uri or the full url if no colon in the string

Definition at line 106 of file File.cpp.

106 {
107 std::string::size_type colon = url.find(COLON_CHAR);
108 if (colon==std::string::npos) return url;
109 return url.substr(colon+1);
110} // uri

◆ working_directory() [1/2]

std::string OksSystem::File::working_directory ( )
static

current directory of process *‍/

Returns
a string containing the working directory for the process

Definition at line 165 of file File.cpp.

165 {
166 char *wd_buffer = getcwd(0,MAXPATHLEN);
167 if (wd_buffer) {
168 std::string directory = std::string(wd_buffer);
169 free(wd_buffer);
170 return directory;
171 }
172 std::string message("getting the current working directory");
173 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "getcwd", message.c_str() );
174} // working_directory

◆ working_directory() [2/2]

void OksSystem::File::working_directory ( const File & dir)
static

set working directory of process *‍/

Definition at line 176 of file File.cpp.

176 {
177 const char * path = dir.c_full_name();
178 const int status = ::chdir(path);
179 if (status<0) {
180 std::string message = "on directory " + dir.full_name();
181 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "chdir", message.c_str() );
182 }
183} // working_directory

Member Data Documentation

◆ FILE_COMMAND_PATH

const char *const OksSystem::File::FILE_COMMAND_PATH = "/usr/bin/file"
staticprotected

Definition at line 48 of file File.hpp.

◆ FILE_FLAG_STR

const char *const OksSystem::File::FILE_FLAG_STR = "-rwxS"
static

column headers for display of permissions *‍/

Definition at line 50 of file File.hpp.

◆ FILE_PROTOCOL

const char *const OksSystem::File::FILE_PROTOCOL = "file"
static

string for the file protocol *‍/

Definition at line 51 of file File.hpp.

◆ HUMAN_OPEN_STR

const char *const OksSystem::File::HUMAN_OPEN_STR = { "READ", "WRITE", "NOBLOCK", "APPEND", "CREATE", "TRUNCATE","EXCLUSIVE" }
staticprotected

strings for pretty printing open flags *‍/

Definition at line 41 of file File.hpp.

◆ HUMAN_SIZE_STR

const char *const OksSystem::File::HUMAN_SIZE_STR = { "B", "KB", "MB", "GB" }
staticprotected

strings for pretty printing file sizes *‍/

Definition at line 40 of file File.hpp.

40:
41

◆ KILOBYTE

const int OksSystem::File::KILOBYTE = 1024
staticprotected

number of bytes in a kilobyte *‍/

Definition at line 45 of file File.hpp.

◆ m_full_name

std::string OksSystem::File::m_full_name
protected

full name (path) of the file *‍/

Definition at line 41 of file File.hpp.


The documentation for this class was generated from the following files: