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 32 of file File.hpp.

Member Typedef Documentation

◆ file_list_t

Definition at line 34 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 296 of file File.cpp.

296 {
297 set_name(name);
298} // File
void set_name(const std::string &name)
sets the name of the file *‍/
Definition File.cpp:380

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

304 {
305 ERS_PRECONDITION(c_name);
306 std::string name = std::string(c_name);
307 set_name(name);
308} // 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 314 of file File.cpp.

314 {
315 set_name(other.m_full_name);
316} // File

◆ ~File()

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

Definition at line 69 of file File.hpp.

69{}

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

412 {
413 return m_full_name.c_str();
414} // c_full_name
std::string m_full_name
full name (path) of the file *‍/
Definition File.hpp:36

◆ child()

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

named child of the current directory *‍/

Definition at line 450 of file File.cpp.

450 {
451 std::string child_name = m_full_name + "/" + name;
452 return OksSystem::File(child_name);
453} // child
Wrapper for file operations.
Definition File.hpp:32

◆ depth() [1/2]

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

depth of the file *‍/

Definition at line 440 of file File.cpp.

440 {
441 return depth(m_full_name);
442} // depth
int depth() const
depth of the file *‍/
Definition File.cpp:440

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

116 {
117 if (path[0] == SLASH_CHAR) {
118 int count = 0;
119 std::string rest = path.substr(1);
120 while(! rest.empty()) {
121 std::string::size_type slash = rest.find(SLASH_CHAR);
122 if (slash==std::string::npos) return count;
123 count++;
124 rest = rest.substr(slash+1);
125 } // while
126 return count;
127 } // path with slash
128 if (protocol(path) == FILE_PROTOCOL) {
129 return depth(uri(path));
130 } //
131 return -1;
132} // depth
#define SLASH_CHAR
Definition File.cpp:48
static std::string protocol(const std::string &url)
extracts the protocol part of an url *‍/
Definition File.cpp:66
static std::string uri(const std::string &url)
extracts the local path of an url *‍/
Definition File.cpp:101
static const char *const FILE_PROTOCOL
string for the file protocol *‍/
Definition File.hpp:46

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

614 {
615 file_list_t file_vector;
616 DIR* directory_ptr = opendir(m_full_name.c_str());
617 if (! directory_ptr) {
618 std::string message = "on directory " + m_full_name;
619 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "opendir", message.c_str() );
620 }
621 while(true) {
622 struct dirent* directory_entry = readdir(directory_ptr);
623 if (directory_entry) {
624 const std::string name = directory_entry->d_name;
625 if ((name!=".") && (name!="..")) {
626 std::string path = m_full_name + "/" + name;
627 OksSystem::File file(path);
628 file_vector.push_back(file);
629 } // if
630 } else {
631 break;
632 } // if / else
633 } // while
634 int status = closedir(directory_ptr);
635 if (status<0) {
636 std::string message = "on directory " + m_full_name;
637 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "closedir", message.c_str() );
638 }
639 return file_vector;
640} // directory
#define ERS_HERE
std::vector< OksSystem::File > file_list_t
Definition File.hpp:34

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

776 {
777 const File father = parent();
778 father.make_path(perm);
779} // ensure_path
OksSystem::File parent() const
parent of the current file *‍/
Definition File.cpp:446
File(const std::string &name)
Definition File.cpp:296

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

347 {
348 return (m_full_name == other.m_full_name);
349} // 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 472 of file File.cpp.

472 {
473 struct stat file_status;
474 const int result = stat(m_full_name.c_str(),&file_status);
475 if (0==result) return true;
476 return false;
477} // 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 185 of file File.cpp.

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

◆ extension() [1/2]

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

extension for file *‍/

Returns
the extension of the file

Definition at line 436 of file File.cpp.

436 {
437 return extension(m_full_name);
438} // extension
std::string extension() const
extension for file *‍/
Definition File.cpp:436

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

77 {
78 std::string::size_type dot = url.rfind(DOT_CHAR);
79 if (dot==std::string::npos) return std::string();
80 return url.substr(dot+1);
81} // extension
#define DOT_CHAR
Definition File.cpp:50

◆ file_type()

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

type of the file *‍/

Definition at line 600 of file File.cpp.

600 {
603 params.push_back("-b");
604 params.push_back(full_name());
605 return first_line(file_command.pipe_in(params));
606} // file_type
Wrapper for executable file manipulation.
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:139
static const char *const FILE_COMMAND_PATH
Definition File.hpp:43
const std::string & full_name() const
full name for file *‍/
Definition File.cpp:406

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

139 {
140 std::string::size_type nl = text.find('\n');
141 if (nl>0) return text.substr(0,nl);
142 return text;
143} // 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 151 of file File.cpp.

151 {
152 std::string prot = protocol(url);
154 const std::string path = uri(url);
155 return File(path);
156} // 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 406 of file File.cpp.

406 {
407 return m_full_name;
408} // 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 485 of file File.cpp.

485 {
486 struct stat file_status;
487 const int result = stat(m_full_name.c_str(),&file_status);
488 if (0==result) {
489 return file_status.st_mode;
490 } // if
491 std::string message = "on file/directory " + m_full_name;
492 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "stat", message.c_str() );
493} // 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 559 of file File.cpp.

559 {
560 struct stat file_status;
561 const int result = stat(m_full_name.c_str(),&file_status);
562 if (0==result) return file_status.st_gid;
563 std::string message = "on file/directory " + m_full_name;
564 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "stat", message.c_str() );
565} // 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 815 of file File.cpp.

815 {
816 try {
817 std::ifstream *stream = new std::ifstream(m_full_name.c_str());
818 stream->exceptions(std::ios::failbit | std::ios::badbit);
819 return stream;
820 } catch (std::ios_base::failure &ex) {
821 throw OksSystem::OpenFileIssue( ERS_HERE, errno, m_full_name.c_str(), ex );
822 } // catch
823} // 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 584 of file File.cpp.

584 {
585 const mode_t mode = get_mode();
586 return (mode & S_IFDIR);
587} // is_regular
mode_t get_mode() const
get mode associated with file (permission + type) *‍/
Definition File.cpp:485

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

594 {
595 const mode_t mode = get_mode();
596 return (mode & S_IFIFO);
597} // 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 573 of file File.cpp.

573 {
574 const mode_t mode = get_mode();
575 return (mode & S_IFREG);
576} // 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 717 of file File.cpp.

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

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

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

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

761 {
762 const File father = parent();
763 if (! father.exists()) {
764 mode_t father_permission = perm | S_IRWXU;// we need rights to write sons
765 father.make_path(father_permission);
766 } // if
767 make_dir(perm);
768} // makepath
void make_dir(mode_t permissions) const
creates a directory *‍/
Definition File.cpp:717

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

336 {
337 return exists();
338} // operator bool

◆ operator const char *()

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

Definition at line 328 of file File.cpp.

328 {
329 return m_full_name.c_str();
330} // 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 356 of file File.cpp.

356 {
357 return size();
358} // operator size_t
size_t size() const
size of file *‍/
Definition File.cpp:530

◆ operator std::string()

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

Definition at line 324 of file File.cpp.

324 {
325 return m_full_name;
326} // 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 832 of file File.cpp.

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

◆ owner()

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

owner of the file *‍/

Definition at line 550 of file File.cpp.

550 {
551 return User(owner_id());
552} // owner
uid_t owner_id() const
owner id of file *‍/
Definition File.cpp:542

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

542 {
543 struct stat file_status;
544 const int result = stat(m_full_name.c_str(),&file_status);
545 if (0==result) return file_status.st_uid;
546 std::string message = "on file/directory " + m_full_name;
547 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "stat", message.c_str() );
548} // owner_id

◆ parent()

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

parent of the current file *‍/

Returns
the parent directory

Definition at line 446 of file File.cpp.

446 {
447 return File(parent_name());
448} // parent
std::string parent_name() const
path of directory containing file *‍/
Definition File.cpp:427

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

427 {
428 std::string::size_type size = m_full_name.size();
429 std::string::size_type slash = m_full_name.rfind(SLASH_CHAR,size-1);
430 if (slash==std::string::npos || slash==0) return ("/");
431 return m_full_name.substr(0,slash);
432} // 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 500 of file File.cpp.

500 {
501 mode_t mode = get_mode();
502 return (mode & 07777);
503} // 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 699 of file File.cpp.

699 {
700 if(perm != permissions()) {
701 const int result = ::chmod(m_full_name.c_str(),perm);
702 if (0==result) {
703 return;
704 }
705 std::string message = "on file/directory " + m_full_name;
706 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "chmod", message.c_str());
707 }
708} // 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 227 of file File.cpp.

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

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

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

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

205 {
206 char buffer[11];
207 buffer[0] = (permissions & S_ISUID) ? SETUID_CHAR_CODE : NOTHING_CHAR_CODE;
208 buffer[1] = (permissions & S_IRUSR) ? READ_CHAR_CODE : NOTHING_CHAR_CODE;
209 buffer[2] = (permissions & S_IWUSR) ? WRITE_CHAR_CODE : NOTHING_CHAR_CODE;
210 buffer[3] = (permissions & S_IXUSR) ? EXECUTE_CHAR_CODE : NOTHING_CHAR_CODE;
211 buffer[4] = (permissions & S_IRGRP) ? READ_CHAR_CODE : NOTHING_CHAR_CODE;
212 buffer[5] = (permissions & S_IWGRP) ? WRITE_CHAR_CODE : NOTHING_CHAR_CODE;
213 buffer[6] = (permissions & S_IXGRP) ? EXECUTE_CHAR_CODE : NOTHING_CHAR_CODE;
214 buffer[7] = (permissions & S_IROTH) ? READ_CHAR_CODE : NOTHING_CHAR_CODE;
215 buffer[8] = (permissions & S_IWOTH) ? WRITE_CHAR_CODE : NOTHING_CHAR_CODE;
216 buffer[9] = (permissions & S_IXOTH) ? EXECUTE_CHAR_CODE : NOTHING_CHAR_CODE;
217 buffer[10] = '\0';
218 return std::string(buffer);
219} // pretty_permissions
#define SETUID_CHAR_CODE
Definition File.cpp:46
#define NOTHING_CHAR_CODE
Definition File.cpp:45
#define WRITE_CHAR_CODE
Definition File.cpp:43
#define EXECUTE_CHAR_CODE
Definition File.cpp:44
#define READ_CHAR_CODE
Definition File.cpp:42

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

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

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

66 {
67 std::string::size_type colon = url.find(COLON_CHAR);
68 if (colon==std::string::npos) return std::string();
69 return url.substr(0,colon);
70} // protocol
#define COLON_CHAR
Definition File.cpp:49

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

665 {
666 if (is_directory()) {
667 file_list_t childs = directory();
668 for (file_list_t::const_iterator p=childs.begin();p!=childs.end();p++) {
669 const File f = *p;
670 if(f.exists()) {
671 f.remove();
672 }
673 } // for
674 rmdir();
675 } else {
676 unlink();
677 }
678} // remove
void unlink() const
deletes (unlinks) file *‍/
Definition File.cpp:646
void rmdir() const
deletes directory *‍/
Definition File.cpp:652
file_list_t directory() const
list of file in directory *‍/
Definition File.cpp:614

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

686 {
687 const char *source = c_full_name() ;
688 const char *dest = other.c_full_name();
689 const int result = ::rename(source,dest);
690 if (0==result) return;
691 throw OksSystem::RenameFileIssue( ERS_HERE, errno, source, dest );
692} // rename
void rename(const File &other) const
rename or moves the file *‍/
Definition File.cpp:686
const char * c_full_name() const
Definition File.cpp:412

◆ rmdir()

void OksSystem::File::rmdir ( ) const

deletes directory *‍/

Definition at line 652 of file File.cpp.

652 {
653 const int result = ::rmdir(m_full_name.c_str());
654 if (0==result) return;
655 std::string message = "on directory " + m_full_name;
656 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "rmdir", message.c_str() );
657} // 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 380 of file File.cpp.

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

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

419 {
420 return short_name(m_full_name);
421} // short_name
std::string short_name() const
short name for file *‍/
Definition File.cpp:419

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

88 {
89 std::string::size_type slash = url.rfind(SLASH_CHAR);
90 if (slash==std::string::npos) return url;
91 return url.substr(slash+1);
92} // 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 530 of file File.cpp.

530 {
531 struct stat file_status;
532 const int result = stat(m_full_name.c_str(),&file_status);
533 if (0==result) return file_status.st_size;
534 std::string message = "on file/directory " + m_full_name;
535 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "stat", message.c_str() );
536} // size

◆ temporary()

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

Definition at line 455 of file File.cpp.

455 {
456 char *tmp_name = tempnam(m_full_name.c_str(),prefix.c_str());
457 if ( !tmp_name ) {
458 std::string message = "while creating a valid filename in directory " + m_full_name;
459 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "tempnam", message.c_str() );
460 }
461 OksSystem::File tmp_file(tmp_name);
462 free(tmp_name);
463 return tmp_file;
464} // 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 518 of file File.cpp.

518 {
519 std::ostringstream stream;
520 stream.setf(std::ios::oct,std::ios::basefield);
521 stream << permissions;
522 return stream.str();
523} // 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 256 of file File.cpp.

256 {
257 ERS_PRECONDITION(u >= 0);
258 if (u==0) return 1;
259 return KILOBYTE * unit(u-1);
260} // unit
static const int KILOBYTE
number of bytes in a kilobyte *‍/
Definition File.hpp:40

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

646 {
647 const int result = ::unlink(m_full_name.c_str());
648 if (0==result) return;
649 throw OksSystem::RemoveFileIssue( ERS_HERE, errno, m_full_name.c_str() );
650} //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 101 of file File.cpp.

101 {
102 std::string::size_type colon = url.find(COLON_CHAR);
103 if (colon==std::string::npos) return url;
104 return url.substr(colon+1);
105} // 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 160 of file File.cpp.

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

◆ working_directory() [2/2]

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

set working directory of process *‍/

Definition at line 171 of file File.cpp.

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

Member Data Documentation

◆ FILE_COMMAND_PATH

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

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

◆ FILE_PROTOCOL

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

string for the file protocol *‍/

Definition at line 46 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 36 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 35 of file File.hpp.

35:
364V
37

◆ KILOBYTE

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

number of bytes in a kilobyte *‍/

Definition at line 40 of file File.hpp.

◆ m_full_name

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

full name (path) of the file *‍/

Definition at line 36 of file File.hpp.


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