[DEV] normalize API of etk::Path
This commit is contained in:
parent
f6ffdb9b25
commit
ea53e1db72
@ -112,26 +112,40 @@ static etk::String simplifyPath(etk::String _input) {
|
|||||||
return _input;
|
return _input;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static etk::String convertToWindows(etk::String _path) {
|
||||||
|
_path.replace("/", "\\");
|
||||||
|
if ( _path.size() > 3
|
||||||
|
&& _path[0] == '/'
|
||||||
|
&& _path[2] == '/') {
|
||||||
|
_path[0] = _path[1];
|
||||||
|
_path[0] = ':';
|
||||||
|
}
|
||||||
|
return _path;
|
||||||
|
}
|
||||||
|
|
||||||
|
static etk::String convertToUnix(etk::String _path) {
|
||||||
|
_path.replace("\\", "/");
|
||||||
|
if ( _path.size() > 3
|
||||||
|
&& _path[1] == ':'
|
||||||
|
&& _path[2] == '/') {
|
||||||
|
#ifndef __TARGET_OS__Windows
|
||||||
|
TK_WARNING("Path name have a windows form: '" << _path << "' c:/ but not a windwos platform");
|
||||||
|
#endif
|
||||||
|
if ( _path[0] >= 'A'
|
||||||
|
&& _path[0] <= 'Z') {
|
||||||
|
_path[1] = _path[0] + 'a' - 'A';
|
||||||
|
} else {
|
||||||
|
_path[1] = _path[0];
|
||||||
|
}
|
||||||
|
_path[0] = '/';
|
||||||
|
}
|
||||||
|
return _path;
|
||||||
|
}
|
||||||
static etk::String parsePath(etk::String _path) {
|
static etk::String parsePath(etk::String _path) {
|
||||||
etk::String out = _path;
|
etk::String out = _path;
|
||||||
TK_DBG_MODE("1 : Set Name : '" << out << "'");
|
TK_DBG_MODE("1 : Set Name : '" << out << "'");
|
||||||
// Replace all time to prevent Windows user error when port on Unix
|
// Replace all time to prevent Windows user error when port on Unix
|
||||||
out.replace("\\", "/");
|
out = convertToUnix(out);
|
||||||
if ( out.size() > 3
|
|
||||||
&& out[1] == ':'
|
|
||||||
&& out[2] == '/') {
|
|
||||||
#ifndef __TARGET_OS__Windows
|
|
||||||
TK_WARNING("Path name have a windows form: '" << _path << "' c:/ but not a windwos platform");
|
|
||||||
#endif
|
|
||||||
if ( out[0] >= 'A'
|
|
||||||
&& out[0] <= 'Z') {
|
|
||||||
out[1] = out[0] + 'a' - 'A';
|
|
||||||
} else {
|
|
||||||
out[1] = out[0];
|
|
||||||
}
|
|
||||||
out[0] = '/';
|
|
||||||
}
|
|
||||||
out = simplifyPath(out);
|
out = simplifyPath(out);
|
||||||
TK_DBG_MODE("3 : parse done : '" << _path << "' ==>\"" << out << "\"");
|
TK_DBG_MODE("3 : parse done : '" << _path << "' ==>\"" << out << "\"");
|
||||||
return out;
|
return out;
|
||||||
@ -147,22 +161,11 @@ etk::String etk::Path::getString() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
etk::String etk::Path::getStringWindows() const {
|
etk::String etk::Path::getStringWindows() const {
|
||||||
etk::String out = m_data;
|
etk::String out = getString();
|
||||||
out.replace("/", "\\");
|
out = convertToWindows(out);
|
||||||
if ( out.size() > 3
|
|
||||||
&& out[0] == '/'
|
|
||||||
&& out[2] == '/') {
|
|
||||||
out[0] = out[1];
|
|
||||||
out[0] = ':';
|
|
||||||
}
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
etk::String etk::Path::getRelative() const {
|
|
||||||
// TODO : plouf ...
|
|
||||||
return "todo";
|
|
||||||
}
|
|
||||||
|
|
||||||
etk::String etk::Path::getNative() const {
|
etk::String etk::Path::getNative() const {
|
||||||
#ifdef __TARGET_OS__Windows
|
#ifdef __TARGET_OS__Windows
|
||||||
return getStringWindows();
|
return getStringWindows();
|
||||||
@ -171,6 +174,50 @@ etk::String etk::Path::getNative() const {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
etk::String etk::Path::getRelative() const {
|
||||||
|
if (isRelative() == true) {
|
||||||
|
return m_data;
|
||||||
|
}
|
||||||
|
// TODO : plouf ...
|
||||||
|
return "todo";
|
||||||
|
}
|
||||||
|
|
||||||
|
etk::String etk::Path::getRelativeWindows() const {
|
||||||
|
etk::String out = getRelative();
|
||||||
|
out = convertToWindows(out);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
etk::String etk::Path::getRelativeNative() const {
|
||||||
|
#ifdef __TARGET_OS__Windows
|
||||||
|
return getRelativeWindows();
|
||||||
|
#else
|
||||||
|
return getRelative();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
etk::String etk::Path::getAbsolute() const {
|
||||||
|
if (isAbsolute() == true) {
|
||||||
|
return m_data;
|
||||||
|
}
|
||||||
|
// TODO : plouf ...
|
||||||
|
return "todo";
|
||||||
|
}
|
||||||
|
|
||||||
|
etk::String etk::Path::getAbsoluteWindows() const {
|
||||||
|
etk::String out = getAbsolute();
|
||||||
|
out = convertToWindows(out);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
etk::String etk::Path::getAbsoluteNative() const {
|
||||||
|
#ifdef __TARGET_OS__Windows
|
||||||
|
return getAbsoluteWindows();
|
||||||
|
#else
|
||||||
|
return getAbsolute();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
bool etk::Path::isRelative() const {
|
bool etk::Path::isRelative() const {
|
||||||
if ( m_data.size() >= 1
|
if ( m_data.size() >= 1
|
||||||
&& m_data[0] != '/') {
|
&& m_data[0] != '/') {
|
||||||
@ -215,7 +262,7 @@ bool etk::Path::operator!= (const etk::Path &_obj) const {
|
|||||||
|
|
||||||
etk::Path etk::Path::operator/ (const etk::String & _element) const {
|
etk::Path etk::Path::operator/ (const etk::String & _element) const {
|
||||||
etk::Path tmp = *this;
|
etk::Path tmp = *this;
|
||||||
tmp /= _element;
|
tmp /= etk::Path(_element);
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,14 +273,7 @@ etk::Path etk::Path::operator/ (const etk::Path & _path) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
etk::Path& etk::Path::operator/= (const etk::String & _element) {
|
etk::Path& etk::Path::operator/= (const etk::String & _element) {
|
||||||
if (_element.size() == 0) {
|
*this /= etk::Path(_element);
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
if (_element[0] == '/') {
|
|
||||||
ETK_THROW_EXCEPTION(etk::exception::InvalidArgument("add path that is absolute"));
|
|
||||||
}
|
|
||||||
m_data += '/' + _element;
|
|
||||||
m_data = simplifyPath(m_data);
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,16 +290,27 @@ etk::Path& etk::Path::operator/= (const etk::Path & _path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
etk::Path etk::Path::operator+ (const etk::String & _element) const {
|
etk::Path etk::Path::operator+ (const etk::String & _element) const {
|
||||||
|
etk::Path tmp = *this;
|
||||||
|
tmp += etk::Path(_element);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
etk::Path etk::Path::operator+ (const etk::Path & _element) const {
|
||||||
etk::Path tmp = *this;
|
etk::Path tmp = *this;
|
||||||
tmp += _element;
|
tmp += _element;
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
etk::Path& etk::Path::operator+= (const etk::String & _element) {
|
etk::Path& etk::Path::operator+= (const etk::String & _element) {
|
||||||
if (_element.size() == 0) {
|
*this += etk::Path(_element);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
etk::Path& etk::Path::operator+= (const etk::Path & _element) {
|
||||||
|
if (_element.m_data.size() == 0) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
m_data += _element;
|
m_data += _element.m_data;
|
||||||
m_data = simplifyPath(m_data);
|
m_data = simplifyPath(m_data);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -30,25 +30,59 @@ namespace etk {
|
|||||||
*/
|
*/
|
||||||
Path(const etk::String& _value);
|
Path(const etk::String& _value);
|
||||||
/**
|
/**
|
||||||
* @brief Get the absolute path
|
* @brief Get the set path (by the user)
|
||||||
* @return string like /home/userXXX/aaa/bbb/### or /c/userXXX/aaa/bbb/###
|
* - /home/userXXX/aaa/bbb/###
|
||||||
|
* - /c/userXXX/aaa/bbb/###
|
||||||
|
* - aaa/bbb/###
|
||||||
*/
|
*/
|
||||||
etk::String getString() const;
|
etk::String getString() const;
|
||||||
/**
|
/**
|
||||||
* @brief Get the absolute path
|
* @brief Get the set path (by the user) with a windows view
|
||||||
* @return string like /home/userXXX/aaa/bbb/### or /c/userXXX/aaa/bbb/###
|
* @return string like:
|
||||||
|
* - \home\userXXX\aaa\bbb\###
|
||||||
|
* - c:\userXXX\aaa\bbb\###
|
||||||
|
* - aaa\bbb\###
|
||||||
*/
|
*/
|
||||||
etk::String getStringWindows() const;
|
etk::String getStringWindows() const;
|
||||||
|
/**
|
||||||
|
* @brief Get the set path (by the user) with the local machine preference view
|
||||||
|
* @return string like:
|
||||||
|
* - /home/userXXX/aaa/bbb/###
|
||||||
|
* - c:\userXXX\aaa\bbb\###
|
||||||
|
* - aaa/bbb/###
|
||||||
|
* - aaa\bbb\###
|
||||||
|
*/
|
||||||
|
etk::String getNative() const;
|
||||||
/**
|
/**
|
||||||
* @brief Get the relative path.
|
* @brief Get the relative path.
|
||||||
* @return string like ../../aaa/bbb/###
|
* @return string like ../../aaa/bbb/###
|
||||||
*/
|
*/
|
||||||
etk::String getRelative() const;
|
etk::String getRelative() const;
|
||||||
/**
|
/**
|
||||||
* @brief Get the absolute path
|
* @brief Get the relative path.
|
||||||
|
* @return string like ..\..\aaa\bbb\###
|
||||||
|
*/
|
||||||
|
etk::String getRelativeWindows() const;
|
||||||
|
/**
|
||||||
|
* @brief Get the absolute path (depend on the system)
|
||||||
|
* @return string like ../../aaa/bbb/### or ..\..\aaa\bbb\###
|
||||||
|
*/
|
||||||
|
etk::String getRelativeNative() const;
|
||||||
|
/**
|
||||||
|
* @brief Get the Absolute path.
|
||||||
|
* @return string like /home/userXXX/aaa/bbb/### or /c/userXXX/aaa/bbb/###
|
||||||
|
*/
|
||||||
|
etk::String getAbsolute() const;
|
||||||
|
/**
|
||||||
|
* @brief Get the Absolute path.
|
||||||
|
* @return string like \home\userXXX\aaa\bbb\### or c:\userXXX\aaa\bbb\###
|
||||||
|
*/
|
||||||
|
etk::String getAbsoluteWindows() const;
|
||||||
|
/**
|
||||||
|
* @brief Get the absolute path (depend on the system)
|
||||||
* @return string like /home/userXXX/aaa/bbb/### or c:\userXXX\aaa\bbb\###
|
* @return string like /home/userXXX/aaa/bbb/### or c:\userXXX\aaa\bbb\###
|
||||||
*/
|
*/
|
||||||
etk::String getNative() const;
|
etk::String getAbsoluteNative() const;
|
||||||
/**
|
/**
|
||||||
* @brief Check if the path is relative or not.
|
* @brief Check if the path is relative or not.
|
||||||
* @return true The path is relative.
|
* @return true The path is relative.
|
||||||
|
@ -17,6 +17,12 @@ extern "C" {
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
}
|
}
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <etk/io/File.hpp>
|
||||||
|
#include <etk/io/SeekMode.hpp>
|
||||||
|
|
||||||
namespace etk {
|
namespace etk {
|
||||||
static int32_t mkdir(const char* _path, mode_t _mode) {
|
static int32_t mkdir(const char* _path, mode_t _mode) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
@ -111,7 +117,7 @@ bool etk::fileSystem::remove(const etk::Path& _path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool etk::fileSystem::removeDirectory(const etk::Path& _path) {
|
bool etk::fileSystem::removeDirectory(const etk::Path& _path) {
|
||||||
if( 0 != ::rmdir(_path1.getString().c_str()) ) {
|
if( 0 != ::rmdir(_path.getString().c_str()) ) {
|
||||||
if (ENOTEMPTY == errno) {
|
if (ENOTEMPTY == errno) {
|
||||||
TK_ERROR("The Directory is not empty...");
|
TK_ERROR("The Directory is not empty...");
|
||||||
}
|
}
|
||||||
@ -121,7 +127,7 @@ bool etk::fileSystem::removeDirectory(const etk::Path& _path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool etk::fileSystem::removeFile(const etk::Path& _path) {
|
bool etk::fileSystem::removeFile(const etk::Path& _path) {
|
||||||
if (0 != unlink(_path1.getString().c_str()) ) {
|
if (0 != unlink(_path.getString().c_str()) ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -140,7 +146,7 @@ bool etk::fileSystem::touch(const etk::Path& _path) {
|
|||||||
bool etk::fileSystem::exist(const etk::Path& _path) {
|
bool etk::fileSystem::exist(const etk::Path& _path) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
if (stat(_path.get().c_str(), &st) != 0) {
|
if (stat(_path.getString().c_str(), &st) != 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -150,7 +156,7 @@ uint64_t etk::fileSystem::fileSize(const etk::Path& _path) {
|
|||||||
// Note : this is a proper methode to get the file size for Big files ... otherwithe the size is limited at 2^31 bytes
|
// Note : this is a proper methode to get the file size for Big files ... otherwithe the size is limited at 2^31 bytes
|
||||||
// tmpStat Buffer :
|
// tmpStat Buffer :
|
||||||
struct stat statProperty;
|
struct stat statProperty;
|
||||||
if (stat(_path.get().c_str(), &statProperty) == -1) {
|
if (stat(_path.getString().c_str(), &statProperty) == -1) {
|
||||||
//Normal case when the file does not exist ... ==> the it was in unknow mode ...
|
//Normal case when the file does not exist ... ==> the it was in unknow mode ...
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -165,7 +171,7 @@ uint64_t etk::fileSystem::fileSize(const etk::Path& _path) {
|
|||||||
bool etk::fileSystem::isDirectory(const etk::Path& _path) {
|
bool etk::fileSystem::isDirectory(const etk::Path& _path) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
if (stat(_path.get().c_str(), &st) != 0) {
|
if (stat(_path.getString().c_str(), &st) != 0) {
|
||||||
return false;
|
return false;
|
||||||
} else if (!S_ISDIR(st.st_mode)) {
|
} else if (!S_ISDIR(st.st_mode)) {
|
||||||
return false;
|
return false;
|
||||||
@ -176,7 +182,7 @@ bool etk::fileSystem::isDirectory(const etk::Path& _path) {
|
|||||||
bool etk::fileSystem::isFile(const etk::Path& _path) {
|
bool etk::fileSystem::isFile(const etk::Path& _path) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
if (stat(_path.get().c_str(), &st) != 0) {
|
if (stat(_path.getString().c_str(), &st) != 0) {
|
||||||
return false;
|
return false;
|
||||||
} else if (!S_ISREG(st.st_mode)) {
|
} else if (!S_ISREG(st.st_mode)) {
|
||||||
return false;
|
return false;
|
||||||
@ -187,7 +193,7 @@ bool etk::fileSystem::isFile(const etk::Path& _path) {
|
|||||||
bool etk::fileSystem::isSymLink(const etk::Path& _path) {
|
bool etk::fileSystem::isSymLink(const etk::Path& _path) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
if (stat(_path.get().c_str(), &st) != 0) {
|
if (stat(_path.getString().c_str(), &st) != 0) {
|
||||||
return false;
|
return false;
|
||||||
} else if (!S_ISLNK(st.st_mode)) {
|
} else if (!S_ISLNK(st.st_mode)) {
|
||||||
return false;
|
return false;
|
||||||
@ -200,7 +206,7 @@ etk::fileSystem::Permissions etk::fileSystem::getPermission(const etk::Path& _pa
|
|||||||
etk::fileSystem::Permissions permissions;
|
etk::fileSystem::Permissions permissions;
|
||||||
// tmpStat Buffer :
|
// tmpStat Buffer :
|
||||||
struct stat statProperty;
|
struct stat statProperty;
|
||||||
if (-1 == stat(m_systemFileName.c_str(), &statProperty)) {
|
if (-1 == stat(_path.getString().c_str(), &statProperty)) {
|
||||||
//Normal case when the file does not exist ... ==> the it was in unknow mode ...
|
//Normal case when the file does not exist ... ==> the it was in unknow mode ...
|
||||||
return permissions;
|
return permissions;
|
||||||
}
|
}
|
||||||
@ -213,12 +219,8 @@ etk::String etk::fileSystem::getRelativeString(const etk::Path& _path) {
|
|||||||
return _path.getRelative();
|
return _path.getRelative();
|
||||||
}
|
}
|
||||||
|
|
||||||
etk::String etk::fileSystem::getDecoratedString(const etk::Path& _path) {
|
|
||||||
return _path.getDecorated();
|
|
||||||
}
|
|
||||||
|
|
||||||
etk::String etk::fileSystem::getAbsoluteString(const etk::Path& _path) {
|
etk::String etk::fileSystem::getAbsoluteString(const etk::Path& _path) {
|
||||||
return _path.get();
|
return _path.getAbsolute();
|
||||||
}
|
}
|
||||||
|
|
||||||
etk::String etk::fileSystem::getSystemString(const etk::Path& _path) {
|
etk::String etk::fileSystem::getSystemString(const etk::Path& _path) {
|
||||||
@ -226,11 +228,11 @@ etk::String etk::fileSystem::getSystemString(const etk::Path& _path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
etk::String etk::fileSystem::getMimeType(const etk::Path& _path) {
|
etk::String etk::fileSystem::getMimeType(const etk::Path& _path) {
|
||||||
|
return "*";
|
||||||
}
|
}
|
||||||
|
|
||||||
etk::Path etk::fileSystem::getTemporaryPath() {
|
etk::Path etk::fileSystem::getTemporaryPath() {
|
||||||
|
return etk::Path{};
|
||||||
}
|
}
|
||||||
|
|
||||||
etk::String etk::fileSystem::getHomePathString() {
|
etk::String etk::fileSystem::getHomePathString() {
|
||||||
|
@ -3,10 +3,9 @@
|
|||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license MPL-2 (see license file)
|
* @license MPL-2 (see license file)
|
||||||
*/
|
*/
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
#include <etk/types.hpp>
|
||||||
#include <etk/io/Interface.hpp>
|
#include <etk/io/File.hpp>
|
||||||
|
#include <etk/debug.hpp>
|
||||||
|
|
||||||
etk::io::File::File() {
|
etk::io::File::File() {
|
||||||
// nothing to do.
|
// nothing to do.
|
||||||
|
@ -18,6 +18,6 @@ namespace etk {
|
|||||||
Append, //!< request File open in append
|
Append, //!< request File open in append
|
||||||
};
|
};
|
||||||
//! @not_in_doc
|
//! @not_in_doc
|
||||||
etk::Stream& operator <<(etk::Stream &_os, const enum etk::OpenMode &_obj);
|
etk::Stream& operator <<(etk::Stream &_os, const enum etk::io::OpenMode &_obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ namespace etk {
|
|||||||
/**
|
/**
|
||||||
* @brief Seek mode availlable (just to wrap it ...)
|
* @brief Seek mode availlable (just to wrap it ...)
|
||||||
*/
|
*/
|
||||||
enum class SeekNode {
|
enum class SeekMode {
|
||||||
Start, //!< request seek position start at the START of the file
|
Start, //!< request seek position start at the START of the file
|
||||||
End, //!< request seek position start at the END of the file
|
End, //!< request seek position start at the END of the file
|
||||||
Current, //!< request seek position start at the CURRENT position in the file
|
Current, //!< request seek position start at the CURRENT position in the file
|
||||||
|
@ -3,11 +3,9 @@
|
|||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license MPL-2 (see license file)
|
* @license MPL-2 (see license file)
|
||||||
*/
|
*/
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
#include <etk/types.hpp>
|
||||||
#include <etk/io/Interface.hpp>
|
|
||||||
#include <etk/io/ZipFile.hpp>
|
#include <etk/io/ZipFile.hpp>
|
||||||
|
#include <etk/debug.hpp>
|
||||||
|
|
||||||
etk::io::ZipFile::ZipFile(ememory::SharedPtr<etk::Archive> _archive):
|
etk::io::ZipFile::ZipFile(ememory::SharedPtr<etk::Archive> _archive):
|
||||||
m_archive(_archive) {
|
m_archive(_archive) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user