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::File > file_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 []
 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 40 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 327 of file File.cpp.

328{
329 set_name(name);
330} // File
void set_name(const std::string &name)
sets the name of the file *‍/
Definition File.cpp:415

◆ 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 336 of file File.cpp.

337{
338 ERS_PRECONDITION(c_name);
339 std::string name = std::string(c_name);
340 set_name(name);
341} // 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 347 of file File.cpp.

348{
349 set_name(other.m_full_name);
350} // File

◆ ~File()

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

Definition at line 78 of file File.hpp.

78{}

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 451 of file File.cpp.

452{
453 return m_full_name.c_str();
454} // c_full_name
std::string m_full_name
full name (path) of the file *‍/
Definition File.hpp:43

◆ child()

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

named child of the current directory *‍/

Definition at line 501 of file File.cpp.

502{
503 std::string child_name = m_full_name + "/" + name;
504 return OksSystem::File(child_name);
505} // child

◆ depth() [1/2]

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

depth of the file *‍/

Definition at line 487 of file File.cpp.

488{
489 return depth(m_full_name);
490} // depth
static int depth(const std::string &path)
calculates depth of a path *‍/
Definition File.cpp:130

◆ 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 130 of file File.cpp.

131{
132 if (path[0] == SLASH_CHAR) {
133 int count = 0;
134 std::string rest = path.substr(1);
135 while (!rest.empty()) {
136 std::string::size_type slash = rest.find(SLASH_CHAR);
137 if (slash == std::string::npos)
138 return count;
139 count++;
140 rest = rest.substr(slash + 1);
141 } // while
142 return count;
143 } // path with slash
144 if (protocol(path) == FILE_PROTOCOL) {
145 return depth(uri(path));
146 } //
147 return -1;
148} // depth
#define SLASH_CHAR
Definition File.cpp:52
static std::string protocol(const std::string &url)
extracts the protocol part of an url *‍/
Definition File.cpp:69
static std::string uri(const std::string &url)
extracts the local path of an url *‍/
Definition File.cpp:113
static const char *const FILE_PROTOCOL
string for the file protocol *‍/
Definition File.hpp:54

◆ 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 692 of file File.cpp.

693{
694 file_list_t file_vector;
695 DIR* directory_ptr = opendir(m_full_name.c_str());
696 if (!directory_ptr) {
697 std::string message = "on directory " + m_full_name;
698 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "opendir", message.c_str());
699 }
700 while (true) {
701 struct dirent* directory_entry = readdir(directory_ptr);
702 if (directory_entry) {
703 const std::string name = directory_entry->d_name;
704 if ((name != ".") && (name != "..")) {
705 std::string path = m_full_name + "/" + name;
706 OksSystem::File file(path);
707 file_vector.push_back(file);
708 } // if
709 } else {
710 break;
711 } // if / else
712 } // while
713 int status = closedir(directory_ptr);
714 if (status < 0) {
715 std::string message = "on directory " + m_full_name;
716 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "closedir", message.c_str());
717 }
718 return file_vector;
719} // directory
#define ERS_HERE
std::vector< OksSystem::File > file_list_t
Definition File.hpp:40
message(message)
Definition __init__.py:84

◆ 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 869 of file File.cpp.

870{
871 const File father = parent();
872 father.make_path(perm);
873} // ensure_path
OksSystem::File parent() const
parent of the current file *‍/
Definition File.cpp:495
File(const std::string &name)
Definition File.cpp:327

◆ 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 383 of file File.cpp.

384{
385 return (m_full_name == other.m_full_name);
386} // 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 526 of file File.cpp.

527{
528 struct stat file_status;
529 const int result = stat(m_full_name.c_str(), &file_status);
530 if (0 == result)
531 return true;
532 return false;
533} // 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 208 of file File.cpp.

209{
210 ERS_PRECONDITION(!path.empty());
211 ERS_PRECONDITION(path[0] == '~');
212 std::string::size_type slash = path.find('/');
213 const std::string user_name = path.substr(1, slash - 1);
214 const std::string rest_path = path.substr(slash);
215 OksSystem::User user;
216 if (!user_name.empty()) {
217 user = OksSystem::User(user_name);
218 }
219 return user.home() + rest_path;
220} // home_directory
const std::string & home() const
home directory name
Definition User.cpp:241

◆ extension() [1/2]

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

extension for file *‍/

Returns
the extension of the file

Definition at line 481 of file File.cpp.

482{
483 return extension(m_full_name);
484} // extension
static std::string extension(const std::string &url)
extracts the extension of a path or an url *‍/
Definition File.cpp:83

◆ 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 83 of file File.cpp.

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

◆ file_type()

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

type of the file *‍/

Definition at line 676 of file File.cpp.

677{
678 OksSystem::Executable file_command(FILE_COMMAND_PATH);
680 params.push_back("-b");
681 params.push_back(full_name());
682 return first_line(file_command.pipe_in(params));
683} // 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:156
static const char *const FILE_COMMAND_PATH
Definition File.hpp:50
const std::string & full_name() const
full name for file *‍/
Definition File.cpp:443

◆ 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 156 of file File.cpp.

157{
158 std::string::size_type nl = text.find('\n');
159 if (nl > 0)
160 return text.substr(0, nl);
161 return text;
162} // 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 170 of file File.cpp.

171{
172 std::string prot = protocol(url);
174 const std::string path = uri(url);
175 return File(path);
176} // 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 443 of file File.cpp.

444{
445 return m_full_name;
446} // 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 542 of file File.cpp.

543{
544 struct stat file_status;
545 const int result = stat(m_full_name.c_str(), &file_status);
546 if (0 == result) {
547 return file_status.st_mode;
548 } // if
549 std::string message = "on file/directory " + m_full_name;
550 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "stat", message.c_str());
551} // 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 629 of file File.cpp.

630{
631 struct stat file_status;
632 const int result = stat(m_full_name.c_str(), &file_status);
633 if (0 == result)
634 return file_status.st_gid;
635 std::string message = "on file/directory " + m_full_name;
636 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "stat", message.c_str());
637} // 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 908 of file File.cpp.

909{
910 try {
911 std::ifstream* stream = new std::ifstream(m_full_name.c_str());
912 stream->exceptions(std::ios::failbit | std::ios::badbit);
913 return stream;
914 } catch (std::ios_base::failure& ex) {
915 throw OksSystem::OpenFileIssue(ERS_HERE, errno, m_full_name.c_str(), ex);
916 } // catch
917} // 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 657 of file File.cpp.

658{
659 const mode_t mode = get_mode();
660 return (mode & S_IFDIR);
661} // is_regular
mode_t get_mode() const
get mode associated with file (permission + type) *‍/
Definition File.cpp:542

◆ 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 669 of file File.cpp.

670{
671 const mode_t mode = get_mode();
672 return (mode & S_IFIFO);
673} // 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 645 of file File.cpp.

646{
647 const mode_t mode = get_mode();
648 return (mode & S_IFREG);
649} // 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 808 of file File.cpp.

809{
810
811 errno = 0;
812 const int result = ::mkdir(m_full_name.c_str(), perm);
813 int mkdir_error = errno;
814
815 if (0 == result) {
816 try {
817 permissions(perm);
818 } catch (OksSystem::OksSystemCallIssue& e) {
819 std::string message = "on directory " + m_full_name;
820 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "mkdir -> chmod", message.c_str());
821 }
822 return;
823 } else {
824 if (exists()) {
825 if (is_directory()) { // already exists we attempt a chmod
826 try {
827 permissions(perm);
828 } catch (OksSystem::OksSystemCallIssue& e) {
829 // ignore this case...
830 }
831 return;
832 } // is directory
833 } else { // exists
834 std::string message = "on directory " + m_full_name;
835 throw OksSystem::OksSystemCallIssue(ERS_HERE, mkdir_error, "mkdir", message.c_str());
836 }
837 }
838
839} // makedir
bool is_directory() const
is the file a regular file *‍/
Definition File.cpp:657
bool exists() const
does the file exist *‍/
Definition File.cpp:526
mode_t permissions() const
permissions for the file *‍/
Definition File.cpp:558

◆ 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 880 of file File.cpp.

881{
882 if (exists()) {
883 if (is_fifo()) {
884 if (perm != permissions()) {
885 permissions(perm);
886 return;
887 } else {
888 return;
889 }
890 } // is_fifo
891 } // exists
892 const int status = ::mkfifo(m_full_name.c_str(), perm);
893 if (status == 0) {
894 permissions(perm);
895 return;
896 }
897 std::string message = "while creating FIFO " + m_full_name;
898 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "mkfifo", message.c_str());
899} // makefifo
bool is_fifo() const
is the file a named pipe *‍/
Definition File.cpp:669

◆ 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 852 of file File.cpp.

853{
854 const File father = parent();
855 if (!father.exists()) {
856 mode_t father_permission = perm | S_IRWXU; // we need rights to write sons
857 father.make_path(father_permission);
858 } // if
859 make_dir(perm);
860} // makepath
void make_dir(mode_t permissions) const
creates a directory *‍/
Definition File.cpp:808

◆ 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 370 of file File.cpp.

371{
372 return exists();
373} // operator bool

◆ operator const char *()

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

Definition at line 361 of file File.cpp.

362{
363 return m_full_name.c_str();
364} // 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 393 of file File.cpp.

394{
395 return size();
396} // operator size_t
size_t size() const
size of file *‍/
Definition File.cpp:593

◆ operator std::string()

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

Definition at line 356 of file File.cpp.

357{
358 return m_full_name;
359} // 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 927 of file File.cpp.

928{
929 try {
930 std::ios::openmode mode = std::ios::out;
931 if (append) {
932 mode |= std::ios::app;
933 }
934 std::ofstream* stream = new std::ofstream(m_full_name.c_str(), mode);
935 stream->exceptions(std::ios::failbit | std::ios::badbit);
936 return stream;
937 } catch (std::ios_base::failure& ex) {
938 throw OksSystem::OpenFileIssue(ERS_HERE, errno, m_full_name.c_str(), ex);
939 } // catch
940} // std::ostream*

◆ owner()

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

owner of the file *‍/

Definition at line 619 of file File.cpp.

620{
621 return User(owner_id());
622} // owner
uid_t owner_id() const
owner id of file *‍/
Definition File.cpp:608
User()
constructor for current user
Definition User.cpp:27

◆ 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 608 of file File.cpp.

609{
610 struct stat file_status;
611 const int result = stat(m_full_name.c_str(), &file_status);
612 if (0 == result)
613 return file_status.st_uid;
614 std::string message = "on file/directory " + m_full_name;
615 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "stat", message.c_str());
616} // owner_id

◆ parent()

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

parent of the current file *‍/

Returns
the parent directory

Definition at line 495 of file File.cpp.

496{
497 return File(parent_name());
498} // parent
std::string parent_name() const
path of directory containing file *‍/
Definition File.cpp:469

◆ 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 469 of file File.cpp.

470{
471 std::string::size_type size = m_full_name.size();
472 std::string::size_type slash = m_full_name.rfind(SLASH_CHAR, size - 1);
473 if (slash == std::string::npos || slash == 0)
474 return ("/");
475 return m_full_name.substr(0, slash);
476} // 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 558 of file File.cpp.

559{
560 mode_t mode = get_mode();
561 return (mode & 07777);
562} // 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 788 of file File.cpp.

789{
790 if (perm != permissions()) {
791 const int result = ::chmod(m_full_name.c_str(), perm);
792 if (0 == result) {
793 return;
794 }
795 std::string message = "on file/directory " + m_full_name;
796 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "chmod", message.c_str());
797 }
798} // 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 253 of file File.cpp.

254{
255 std::ostringstream flag_str;
256 if (flags & O_WRONLY) {
257 flag_str << HUMAN_OPEN_STR[1];
258 } else if (flags & O_RDWR) {
259 flag_str << HUMAN_OPEN_STR[0] << "-" << HUMAN_OPEN_STR[1];
260 } else {
261 flag_str << HUMAN_OPEN_STR[0];
262 }
263 if (flags & O_NONBLOCK) {
264 flag_str << "/" << HUMAN_OPEN_STR[2];
265 }
266 if (flags & O_APPEND) {
267 flag_str << "/" << HUMAN_OPEN_STR[3];
268 }
269 if (flags & O_CREAT) {
270 flag_str << "/" << HUMAN_OPEN_STR[4];
271 }
272 if (flags & O_TRUNC) {
273 flag_str << "/" << HUMAN_OPEN_STR[5];
274 }
275 if (flags & O_EXCL) {
276 flag_str << "/" << HUMAN_OPEN_STR[6];
277 }
278 flag_str << "(" << flags << ")";
279 return flag_str.str();
280} // pretty_open_permission
static const char *const HUMAN_OPEN_STR[]
strings for pretty printing open flags *‍/
Definition File.hpp:40

◆ 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 569 of file File.cpp.

570{
572} // pretty_permissions
static std::string pretty_permissions(mode_t permissions)
pretty prints permissions *‍/
Definition File.cpp:229

◆ 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 229 of file File.cpp.

230{
231 char buffer[11];
232 buffer[0] = (permissions & S_ISUID) ? SETUID_CHAR_CODE : NOTHING_CHAR_CODE;
233 buffer[1] = (permissions & S_IRUSR) ? READ_CHAR_CODE : NOTHING_CHAR_CODE;
234 buffer[2] = (permissions & S_IWUSR) ? WRITE_CHAR_CODE : NOTHING_CHAR_CODE;
235 buffer[3] = (permissions & S_IXUSR) ? EXECUTE_CHAR_CODE : NOTHING_CHAR_CODE;
236 buffer[4] = (permissions & S_IRGRP) ? READ_CHAR_CODE : NOTHING_CHAR_CODE;
237 buffer[5] = (permissions & S_IWGRP) ? WRITE_CHAR_CODE : NOTHING_CHAR_CODE;
238 buffer[6] = (permissions & S_IXGRP) ? EXECUTE_CHAR_CODE : NOTHING_CHAR_CODE;
239 buffer[7] = (permissions & S_IROTH) ? READ_CHAR_CODE : NOTHING_CHAR_CODE;
240 buffer[8] = (permissions & S_IWOTH) ? WRITE_CHAR_CODE : NOTHING_CHAR_CODE;
241 buffer[9] = (permissions & S_IXOTH) ? EXECUTE_CHAR_CODE : NOTHING_CHAR_CODE;
242 buffer[10] = '\0';
243 return std::string(buffer);
244} // pretty_permissions
#define SETUID_CHAR_CODE
Definition File.cpp:50
#define NOTHING_CHAR_CODE
Definition File.cpp:49
#define WRITE_CHAR_CODE
Definition File.cpp:47
#define EXECUTE_CHAR_CODE
Definition File.cpp:48
#define READ_CHAR_CODE
Definition File.cpp:46

◆ 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 301 of file File.cpp.

302{
303 if (0 == size)
304 return "0";
305 std::ostringstream size_str;
306 bool writen_something = false;
307 for (int i = 3; i >= 0; i--) {
308 const unsigned int size_unit = unit(i);
309 if (size > size_unit && !(cut_small && writen_something)) {
310 const int amount = size / size_unit;
311 size = size % size_unit;
312 size_str << amount << SPACE_CHAR << HUMAN_SIZE_STR[i];
313 writen_something = true;
314 } // if unit is present
315 } // loop
316 return size_str.str();
317} // pretty_size
#define SPACE_CHAR
Definition File.cpp:37
static int unit(int u)
calculates the value of a computer unit of order n (i.e KB,GB, etc *‍/
Definition File.cpp:283
static const char *const HUMAN_SIZE_STR[]
strings for pretty printing file sizes *‍/
Definition File.hpp:39

◆ 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 69 of file File.cpp.

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

◆ 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 750 of file File.cpp.

751{
752 if (is_directory()) {
753 file_list_t childs = directory();
754 for (file_list_t::const_iterator p = childs.begin(); p != childs.end(); p++) {
755 const File f = *p;
756 if (f.exists()) {
757 f.remove();
758 }
759 } // for
760 rmdir();
761 } else {
762 unlink();
763 }
764} // remove
void unlink() const
deletes (unlinks) file *‍/
Definition File.cpp:726
void rmdir() const
deletes directory *‍/
Definition File.cpp:735
file_list_t directory() const
list of file in directory *‍/
Definition File.cpp:692

◆ 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 772 of file File.cpp.

773{
774 const char* source = c_full_name();
775 const char* dest = other.c_full_name();
776 const int result = ::rename(source, dest);
777 if (0 == result)
778 return;
779 throw OksSystem::RenameFileIssue(ERS_HERE, errno, source, dest);
780} // rename
void rename(const File &other) const
rename or moves the file *‍/
Definition File.cpp:772
const char * c_full_name() const
Definition File.cpp:451

◆ rmdir()

void OksSystem::File::rmdir ( ) const

deletes directory *‍/

Definition at line 735 of file File.cpp.

736{
737 const int result = ::rmdir(m_full_name.c_str());
738 if (0 == result)
739 return;
740 std::string message = "on directory " + m_full_name;
741 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "rmdir", message.c_str());
742} // 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 415 of file File.cpp.

416{
417 ERS_PRECONDITION(!name.empty());
418 const char c = name[0];
419 std::string long_path;
420 switch (c) {
421 case '/':
422 long_path = name;
423 break;
424 case '~':
425 long_path = expand_home(name);
426 break;
427 default:
428 long_path = working_directory() + "/" + name;
429 break;
430 } // switch
431 char buffer[PATH_MAX];
432 const char* result = realpath(long_path.c_str(), buffer);
433 if (result == 0) { // could not resolve path
434 m_full_name = long_path;
435 } else { // we could canonicalize the path
436 m_full_name = buffer;
437 } //
438} // set_name
static std::string working_directory()
current directory of process *‍/
Definition File.cpp:181
static std::string expand_home(const std::string path)
resolve home directory *‍/
Definition File.cpp:208

◆ 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 459 of file File.cpp.

460{
461 return short_name(m_full_name);
462} // short_name
static std::string short_name(const std::string &url)
extracts the short file name of an url *‍/
Definition File.cpp:97

◆ 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 97 of file File.cpp.

98{
99 std::string::size_type slash = url.rfind(SLASH_CHAR);
100 if (slash == std::string::npos)
101 return url;
102 return url.substr(slash + 1);
103} // 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 593 of file File.cpp.

594{
595 struct stat file_status;
596 const int result = stat(m_full_name.c_str(), &file_status);
597 if (0 == result)
598 return file_status.st_size;
599 std::string message = "on file/directory " + m_full_name;
600 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "stat", message.c_str());
601} // size

◆ temporary()

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

Definition at line 508 of file File.cpp.

509{
510 char* tmp_name = tempnam(m_full_name.c_str(), prefix.c_str());
511 if (!tmp_name) {
512 std::string message = "while creating a valid filename in directory " + m_full_name;
513 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "tempnam", message.c_str());
514 }
515 OksSystem::File tmp_file(tmp_name);
516 free(tmp_name);
517 return tmp_file;
518} // 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 580 of file File.cpp.

581{
582 std::ostringstream stream;
583 stream.setf(std::ios::oct, std::ios::basefield);
584 stream << permissions;
585 return stream.str();
586} // 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 283 of file File.cpp.

284{
285 ERS_PRECONDITION(u >= 0);
286 if (u == 0)
287 return 1;
288 return KILOBYTE * unit(u - 1);
289} // unit
static const int KILOBYTE
number of bytes in a kilobyte *‍/
Definition File.hpp:47

◆ 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 726 of file File.cpp.

727{
728 const int result = ::unlink(m_full_name.c_str());
729 if (0 == result)
730 return;
731 throw OksSystem::RemoveFileIssue(ERS_HERE, errno, m_full_name.c_str());
732} // 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 113 of file File.cpp.

114{
115 std::string::size_type colon = url.find(COLON_CHAR);
116 if (colon == std::string::npos)
117 return url;
118 return url.substr(colon + 1);
119} // 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 181 of file File.cpp.

182{
183 char* wd_buffer = getcwd(0, MAXPATHLEN);
184 if (wd_buffer) {
185 std::string directory = std::string(wd_buffer);
186 free(wd_buffer);
187 return directory;
188 }
189 std::string message("getting the current working directory");
190 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "getcwd", message.c_str());
191} // working_directory

◆ working_directory() [2/2]

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

set working directory of process *‍/

Definition at line 194 of file File.cpp.

195{
196 const char* path = dir.c_full_name();
197 const int status = ::chdir(path);
198 if (status < 0) {
199 std::string message = "on directory " + dir.full_name();
200 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "chdir", message.c_str());
201 }
202} // working_directory

Member Data Documentation

◆ FILE_COMMAND_PATH

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

Definition at line 50 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 53 of file File.hpp.

◆ FILE_PROTOCOL

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

string for the file protocol *‍/

Definition at line 54 of file File.hpp.

◆ HUMAN_OPEN_STR

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

strings for pretty printing open flags *‍/

Definition at line 40 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 39 of file File.hpp.

◆ KILOBYTE

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

number of bytes in a kilobyte *‍/

Definition at line 47 of file File.hpp.

◆ m_full_name

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

full name (path) of the file *‍/

Definition at line 43 of file File.hpp.


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