285 lines
6.6 KiB
C++
285 lines
6.6 KiB
C++
#ifndef __UT_FILE_SYSTEM_HPP__
|
|
#define __UT_FILE_SYSTEM_HPP__
|
|
|
|
#include <unitree/common/decl.hpp>
|
|
|
|
#define UT_FILE_READ_SIZE 65536 //64K
|
|
#define UT_FILE_READ_BIGGER_SIZE 262144 //256K
|
|
|
|
#define UT_FD_INVALID -1
|
|
#define UT_FD_STDIN STDIN_FILENO
|
|
#define UT_FD_STDOUT STDOUT_FILENO
|
|
#define UT_FD_STDERR STDERR_FILENO
|
|
|
|
#define UT_PATH_DELIM_CHAR '/'
|
|
#define UT_PATH_DELIM_STR "/"
|
|
#define UT_PATH_TRIM_DELIM_STR " \t\r\n"
|
|
|
|
#define NOT_FLAG(f, flag) \
|
|
(((f) & (flag)) != (flag))
|
|
|
|
#define HAS_FLAG(f, flag) \
|
|
(((f) & (flag)) == (flag))
|
|
|
|
#define SET_FLAG(f, flag) \
|
|
(f) |= (flag)
|
|
|
|
#define IS_RDONLY_FLAG(f) \
|
|
((f & O_ACCMODE) == O_RDONLY)
|
|
|
|
namespace unitree
|
|
{
|
|
namespace common
|
|
{
|
|
enum
|
|
{
|
|
UT_OPEN_FLAG_R = O_RDONLY,
|
|
UT_OPEN_FLAG_W = O_WRONLY,
|
|
UT_OPEN_FLAG_RW = O_RDWR,
|
|
UT_OPEN_FLAG_T = O_TRUNC,
|
|
UT_OPEN_FLAG_A = O_APPEND,
|
|
UT_OPEN_FLAG_S = O_SYNC,
|
|
UT_OPEN_FLAG_C = O_CREAT,
|
|
UT_OPEN_FLAG_CW = O_CREAT | O_WRONLY,
|
|
UT_OPEN_FLAG_CWT = O_CREAT | O_WRONLY | O_TRUNC,
|
|
UT_OPEN_FLAG_CA = O_CREAT | O_RDWR | O_APPEND,
|
|
UT_OPEN_FLAG_CS = O_CREAT | O_RDWR | O_SYNC,
|
|
UT_OPEN_FLAG_CAS = O_CREAT | O_RDWR | O_APPEND | O_SYNC,
|
|
UT_OPEN_FLAG_CTS = O_CREAT | O_RDWR | O_TRUNC | O_SYNC
|
|
};
|
|
|
|
enum
|
|
{
|
|
UT_OPEN_MODE_NONE = 0,
|
|
UT_OPEN_MODE_RW = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH,
|
|
UT_OPEN_MODE_RWX = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH
|
|
};
|
|
|
|
enum
|
|
{
|
|
UT_OPEN_MASK_000 = 0,
|
|
UT_OPEN_MASK_022 = 0022
|
|
};
|
|
|
|
typedef struct dirent DIRENT;
|
|
|
|
/*
|
|
* FileSystemHelper
|
|
*/
|
|
class FileSystemHelper
|
|
{
|
|
public:
|
|
static FileSystemHelper* Instance()
|
|
{
|
|
static FileSystemHelper inst;
|
|
return &inst;
|
|
}
|
|
|
|
/*
|
|
* File Functions
|
|
*/
|
|
int32_t Open(const std::string& fileName, int32_t flag, uint32_t mode = 0);
|
|
|
|
int64_t Write(int32_t fd, const char* s, int64_t len);
|
|
int64_t Write(int32_t fd, const std::string& s);
|
|
|
|
int64_t Read(int32_t fd, char* s, int64_t len);
|
|
int64_t Read(int32_t fd, std::string& s, int64_t len);
|
|
int64_t ReadAll(int32_t fd, std::string& s);
|
|
|
|
int64_t Seek(int32_t fd, int64_t offset, int64_t whence);
|
|
|
|
bool Stat(int32_t fd, struct stat& statbuf);
|
|
void Truncate(int32_t fd, int64_t len);
|
|
void Sync(int32_t fd);
|
|
void Close(int32_t fd);
|
|
|
|
/*
|
|
* Directory Functions
|
|
*/
|
|
DIR* Opendir(const std::string& dirName);
|
|
DIRENT* Readdir(DIR* dir);
|
|
void Closedir(DIR* dir);
|
|
|
|
void Makedir(const std::string& dirName, uint32_t mode = UT_OPEN_MODE_RWX,
|
|
bool ignoreExist = true);
|
|
void MakedirRecurse(const std::string& dirName, uint32_t mode = UT_OPEN_MODE_RWX);
|
|
|
|
/*
|
|
* stat Function
|
|
*/
|
|
bool Stat(const std::string& name, struct stat& statbuf);
|
|
bool StatL(const std::string& name, struct stat& statbuf);
|
|
bool IsFile(const struct stat& statbuf);
|
|
bool IsDirectory(const struct stat& statbuf);
|
|
bool IsSymlink(const struct stat& statbuf);
|
|
bool ExistFile(const std::string& name);
|
|
bool ExistDirectory(const std::string& name);
|
|
bool Exist(const std::string& name);
|
|
|
|
int64_t GetFileSize(const std::string& fileName);
|
|
|
|
/*
|
|
* Symlink Function
|
|
*/
|
|
std::string GetSymlink(const std::string& symlinkName);
|
|
bool Symlink(const std::string& targetFileName, const std::string& symlinkName);
|
|
|
|
/*
|
|
* Remove and Rename Function
|
|
*/
|
|
void RemoveFile(const std::string& fileName, bool ignoreNoExist = true);
|
|
void RemoveDirectory(const std::string& dirName, bool ignoreNoExist = true);
|
|
|
|
void Remove(const std::string& name, bool ignoreNoExist = true);
|
|
void Rename(const std::string& oldName, const std::string& newName);
|
|
|
|
/*
|
|
* Path proccess Function
|
|
*/
|
|
std::string& NormalizePath(std::string& s, bool withEndDelim = true);
|
|
std::string GetFatherDirectory(const std::string& s, bool withEndDelim = true);
|
|
std::string GetFileName(const std::string& s);
|
|
std::string GetLastName(const std::string& s);
|
|
|
|
/*
|
|
* Realpath
|
|
*/
|
|
std::string GetRealName(const std::string& name);
|
|
|
|
bool IsSame(const std::string& name1, const std::string& name2);
|
|
|
|
/*
|
|
* MMap Function
|
|
*/
|
|
void* MmapRead(int32_t fd, int64_t offset, int64_t len);
|
|
void Munmap(void *addr, int64_t len);
|
|
|
|
/*
|
|
* Mode and Owner
|
|
*/
|
|
bool Chmod(const std::string& name, mode_t mode);
|
|
bool Chown(const std::string& name, uid_t uid, gid_t gid);
|
|
|
|
bool ChmodL(const std::string& name, mode_t mode);
|
|
bool ChownL(const std::string& name, uid_t uid, gid_t gid);
|
|
|
|
bool UTime(const std::string& name, struct utimbuf& times);
|
|
bool UTime(const std::string& name, struct timeval times[2]);
|
|
|
|
bool Chattr(const std::string& name, const struct stat& statbuf);
|
|
|
|
/*
|
|
* ParseModeString
|
|
* @param s: like "0755", "0666", "766"
|
|
* return mode
|
|
*/
|
|
uint32_t ParseModeString(const std::string& s);
|
|
|
|
private:
|
|
FileSystemHelper();
|
|
~FileSystemHelper();
|
|
|
|
private:
|
|
int32_t mOldMask;
|
|
};
|
|
|
|
/*
|
|
* FDCloser
|
|
*/
|
|
class FDCloser
|
|
{
|
|
public:
|
|
explicit FDCloser() :
|
|
mFd(UT_FD_INVALID)
|
|
{}
|
|
|
|
explicit FDCloser(int32_t fd) :
|
|
mFd(fd)
|
|
{}
|
|
|
|
~FDCloser()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
void SetFd(int32_t fd)
|
|
{
|
|
//close old fd
|
|
Close();
|
|
//set new fd
|
|
mFd = fd;
|
|
}
|
|
|
|
private:
|
|
void Close()
|
|
{
|
|
if (mFd > 0)
|
|
{
|
|
FileSystemHelper::Instance()->Close(mFd);
|
|
mFd = UT_FD_INVALID;
|
|
}
|
|
}
|
|
|
|
private:
|
|
int32_t mFd;
|
|
};
|
|
|
|
/*
|
|
* DIRCloser
|
|
*/
|
|
class DIRCloser
|
|
{
|
|
public:
|
|
explicit DIRCloser() :
|
|
mDIR(NULL)
|
|
{}
|
|
|
|
explicit DIRCloser(DIR* dir) :
|
|
mDIR(dir)
|
|
{}
|
|
|
|
~DIRCloser()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
void SetDir(DIR* dir)
|
|
{
|
|
//close old dir
|
|
Close();
|
|
//set new dir
|
|
mDIR = dir;
|
|
}
|
|
|
|
private:
|
|
void Close()
|
|
{
|
|
if (mDIR != NULL)
|
|
{
|
|
FileSystemHelper::Instance()->Closedir(mDIR);
|
|
mDIR = NULL;
|
|
}
|
|
}
|
|
|
|
private:
|
|
DIR* mDIR;
|
|
};
|
|
|
|
//Function
|
|
void Remove(const std::string& name);
|
|
void Rename(const std::string& oldName, const std::string& newName);
|
|
|
|
std::string NormalizePath(const std::string& s, bool withEndDelim = false);
|
|
std::string GetFatherDirectory(const std::string& s, bool withEndDelim = false);
|
|
std::string GetFileName(const std::string& s);
|
|
std::string GetLastName(const std::string& s);
|
|
|
|
void Chattr(const std::string& name, const struct stat& statbuf);
|
|
void Copyattr(const std::string& name, const std::string& templateName);
|
|
}
|
|
|
|
}
|
|
|
|
#endif//__UT_FILE_SYSTEM_HPP__
|