diff options
author | Jacob Keeler <jacob.keeler@livioradio.com> | 2016-09-20 11:44:51 -0400 |
---|---|---|
committer | Jacob Keeler <jacob.keeler@livioradio.com> | 2016-09-20 14:37:25 -0400 |
commit | 039581419749dbdd32590804e8b14a77fcaf9636 (patch) | |
tree | ced927fc4bef4686f7373a5f45dd692bd9fc9de0 /src/components/utils/src/file_system.cc | |
parent | 1b96b7c02d2e338b846a7314c6fa0bdaa31f7c5e (diff) | |
parent | aff7f09a4ec07becfb64dc78992580061d3342ff (diff) | |
download | sdl_core-039581419749dbdd32590804e8b14a77fcaf9636.tar.gz |
Merge branch 'master'
Diffstat (limited to 'src/components/utils/src/file_system.cc')
-rw-r--r-- | src/components/utils/src/file_system.cc | 133 |
1 files changed, 70 insertions, 63 deletions
diff --git a/src/components/utils/src/file_system.cc b/src/components/utils/src/file_system.cc index 1e7f25f342..0ae6f973be 100644 --- a/src/components/utils/src/file_system.cc +++ b/src/components/utils/src/file_system.cc @@ -43,12 +43,13 @@ // TODO(VS): lint error: Streams are highly discouraged. #include <fstream> #include <cstddef> +#include <cstdio> #include <algorithm> CREATE_LOGGERPTR_GLOBAL(logger_, "Utils") uint64_t file_system::GetAvailableDiskSpace(const std::string& path) { - struct statvfs fsInfo = { 0 }; + struct statvfs fsInfo = {0}; if (statvfs(path.c_str(), &fsInfo) == 0) { return fsInfo.f_bsize * fsInfo.f_bfree; } else { @@ -56,9 +57,9 @@ uint64_t file_system::GetAvailableDiskSpace(const std::string& path) { } } -int64_t file_system::FileSize(const std::string &path) { +int64_t file_system::FileSize(const std::string& path) { if (file_system::FileExists(path)) { - struct stat file_info = { 0 }; + struct stat file_info = {0}; if (0 != stat(path.c_str(), &file_info)) { LOG4CXX_WARN_WITH_ERRNO(logger_, "Could not get file size: " << path); } else { @@ -77,20 +78,19 @@ size_t file_system::DirectorySize(const std::string& path) { struct dirent dir_element_; struct dirent* dir_element = &dir_element_; #else - char* direntbuffer = - new char[offsetof(struct dirent, d_name) + - pathconf(path.c_str(), _PC_NAME_MAX) + 1]; - struct dirent* dir_element = new(direntbuffer) dirent; + char* direntbuffer = new char[offsetof(struct dirent, d_name) + + pathconf(path.c_str(), _PC_NAME_MAX) + 1]; + struct dirent* dir_element = new (direntbuffer) dirent; #endif struct dirent* result = NULL; - struct stat file_info = { 0 }; + struct stat file_info = {0}; directory = opendir(path.c_str()); if (NULL != directory) { return_code = readdir_r(directory, dir_element, &result); for (; NULL != result && 0 == return_code; return_code = readdir_r(directory, dir_element, &result)) { - if (0 == strcmp(result->d_name, "..") - || 0 == strcmp(result->d_name, ".")) { + if (0 == strcmp(result->d_name, "..") || + 0 == strcmp(result->d_name, ".")) { continue; } std::string full_element_path = path + "/" + result->d_name; @@ -140,7 +140,7 @@ bool file_system::CreateDirectoryRecursively(const std::string& path) { } bool file_system::IsDirectory(const std::string& name) { - struct stat status = { 0 }; + struct stat status = {0}; if (-1 == stat(name.c_str(), &status)) { return false; @@ -150,7 +150,7 @@ bool file_system::IsDirectory(const std::string& name) { } bool file_system::DirectoryExists(const std::string& name) { - struct stat status = { 0 }; + struct stat status = {0}; if (-1 == stat(name.c_str(), &status) || !S_ISDIR(status.st_mode)) { return false; @@ -160,7 +160,7 @@ bool file_system::DirectoryExists(const std::string& name) { } bool file_system::FileExists(const std::string& name) { - struct stat status = { 0 }; + struct stat status = {0}; if (-1 == stat(name.c_str(), &status)) { return false; @@ -168,9 +168,9 @@ bool file_system::FileExists(const std::string& name) { return true; } -bool file_system::Write( - const std::string& file_name, const std::vector<uint8_t>& data, - std::ios_base::openmode mode) { +bool file_system::Write(const std::string& file_name, + const std::vector<uint8_t>& data, + std::ios_base::openmode mode) { std::ofstream file(file_name.c_str(), std::ios_base::binary | mode); if (file.is_open()) { for (uint32_t i = 0; i < data.size(); ++i) { @@ -184,15 +184,13 @@ bool file_system::Write( std::ofstream* file_system::Open(const std::string& file_name, std::ios_base::openmode mode) { - - std::ofstream* file = new std::ofstream(); - file->open( file_name.c_str(),std::ios_base::binary | mode); + file->open(file_name.c_str(), std::ios_base::binary | mode); if (file->is_open()) { - return file; } + delete file; return NULL; } @@ -224,6 +222,15 @@ std::string file_system::CurrentWorkingDirectory() { return std::string(path); } +std::string file_system::GetAbsolutePath(const std::string& path) { + char abs_path[PATH_MAX]; + if (NULL == realpath(path.c_str(), abs_path)) { + return std::string(); + } + + return std::string(abs_path); +} + bool file_system::DeleteFile(const std::string& name) { if (FileExists(name) && IsAccessible(name, W_OK)) { return !remove(name.c_str()); @@ -241,7 +248,7 @@ void file_system::remove_directory_content(const std::string& directory_name) { char* direntbuffer = new char[offsetof(struct dirent, d_name) + pathconf(directory_name.c_str(), _PC_NAME_MAX) + 1]; - struct dirent* dir_element = new(direntbuffer) dirent; + struct dirent* dir_element = new (direntbuffer) dirent; #endif struct dirent* result = NULL; @@ -252,8 +259,8 @@ void file_system::remove_directory_content(const std::string& directory_name) { for (; NULL != result && 0 == return_code; return_code = readdir_r(directory, dir_element, &result)) { - if (0 == strcmp(result->d_name, "..") - || 0 == strcmp(result->d_name, ".")) { + if (0 == strcmp(result->d_name, "..") || + 0 == strcmp(result->d_name, ".")) { continue; } @@ -279,8 +286,7 @@ void file_system::remove_directory_content(const std::string& directory_name) { bool file_system::RemoveDirectory(const std::string& directory_name, bool is_recursively) { - if (DirectoryExists(directory_name) - && IsAccessible(directory_name, W_OK)) { + if (DirectoryExists(directory_name) && IsAccessible(directory_name, W_OK)) { if (is_recursively) { remove_directory_content(directory_name); } @@ -303,7 +309,7 @@ bool file_system::IsReadingAllowed(const std::string& name) { } std::vector<std::string> file_system::ListFiles( - const std::string& directory_name) { + const std::string& directory_name) { std::vector<std::string> listFiles; if (!DirectoryExists(directory_name)) { return listFiles; @@ -318,7 +324,7 @@ std::vector<std::string> file_system::ListFiles( char* direntbuffer = new char[offsetof(struct dirent, d_name) + pathconf(directory_name.c_str(), _PC_NAME_MAX) + 1]; - struct dirent* dir_element = new(direntbuffer) dirent; + struct dirent* dir_element = new (direntbuffer) dirent; #endif struct dirent* result = NULL; @@ -328,8 +334,8 @@ std::vector<std::string> file_system::ListFiles( for (; NULL != result && 0 == return_code; return_code = readdir_r(directory, dir_element, &result)) { - if (0 == strcmp(result->d_name, "..") - || 0 == strcmp(result->d_name, ".")) { + if (0 == strcmp(result->d_name, "..") || + 0 == strcmp(result->d_name, ".")) { continue; } @@ -337,7 +343,6 @@ std::vector<std::string> file_system::ListFiles( } closedir(directory); - } #ifdef __QNXNTO__ @@ -350,7 +355,7 @@ std::vector<std::string> file_system::ListFiles( bool file_system::WriteBinaryFile(const std::string& name, const std::vector<uint8_t>& contents) { using namespace std; - ofstream output(name.c_str(), ios_base::binary|ios_base::trunc); + ofstream output(name.c_str(), ios_base::binary | ios_base::trunc); output.write(reinterpret_cast<const char*>(&contents.front()), contents.size()); return output.good(); @@ -365,7 +370,7 @@ bool file_system::ReadBinaryFile(const std::string& name, std::ifstream file(name.c_str(), std::ios_base::binary); std::ostringstream ss; ss << file.rdbuf(); - const std::string& s = ss.str(); + const std::string s = ss.str(); result.resize(s.length()); std::copy(s.begin(), s.end(), result.begin()); @@ -389,29 +394,20 @@ const std::string file_system::ConvertPathForURL(const std::string& path) { std::string::const_iterator it_path_end = path.end(); const std::string reserved_symbols = "!#$&'()*+,:;=?@[] "; - std::string::const_iterator it_sym = reserved_symbols.begin(); - std::string::const_iterator it_sym_end = reserved_symbols.end(); - + size_t pos = std::string::npos; std::string converted_path; - while (it_path != it_path_end) { - - it_sym = reserved_symbols.begin(); - for (; it_sym != it_sym_end; ++it_sym) { - if (*it_path == *it_sym) { - const size_t size = 100; - char percent_value[size]; - snprintf(percent_value, size, "%%%x", *it_path); - converted_path += percent_value; - ++it_path; - continue; - } + for (; it_path != it_path_end; ++it_path) { + pos = reserved_symbols.find_first_of(*it_path); + if (pos != std::string::npos) { + const size_t size = 100; + char percent_value[size]; + snprintf(percent_value, size, "%%%x", *it_path); + converted_path += percent_value; + } else { + converted_path += *it_path; } - - converted_path += *it_path; - ++it_path; } - return converted_path; } @@ -425,7 +421,6 @@ bool file_system::CreateFile(const std::string& path) { } } - uint64_t file_system::GetFileModificationTime(const std::string& path) { struct stat info; if (0 != stat(path.c_str(), &info)) { @@ -438,8 +433,7 @@ uint64_t file_system::GetFileModificationTime(const std::string& path) { #endif } -bool file_system::CopyFile(const std::string& src, - const std::string& dst) { +bool file_system::CopyFile(const std::string& src, const std::string& dst) { if (!FileExists(src) || FileExists(dst) || !CreateFile(dst)) { return false; } @@ -451,14 +445,27 @@ bool file_system::CopyFile(const std::string& src, return true; } -bool file_system::MoveFile(const std::string& src, - const std::string& dst) { - if (!CopyFile(src, dst)) { - return false; - } - if (!DeleteFile(src)) { - DeleteFile(dst); - return false; +bool file_system::MoveFile(const std::string& src, const std::string& dst) { + if (std::rename(src.c_str(), dst.c_str()) == 0) { + return true; + } else { + // In case of src and dst on different file systems std::rename returns + // an error (at least on QNX). + // Seems, streams are not recommended for use, so have + // to find another way to do this. + std::ifstream s_src(src, std::ios::binary); + if (!s_src.good()) { + return false; + } + std::ofstream s_dst(dst, std::ios::binary); + if (!s_dst.good()) { + return false; + } + s_dst << s_src.rdbuf(); + s_dst.close(); + s_src.close(); + DeleteFile(src); + return true; } - return true; + return false; } |