2015-04-24 21:38:11 +00:00
|
|
|
#pragma once
|
|
|
|
|
2015-08-12 01:52:26 +00:00
|
|
|
enum class fsm : u32 // file seek mode
|
2015-04-24 21:38:11 +00:00
|
|
|
{
|
2015-08-12 01:52:26 +00:00
|
|
|
begin,
|
|
|
|
cur,
|
|
|
|
end,
|
2015-04-24 21:38:11 +00:00
|
|
|
};
|
|
|
|
|
2015-08-12 01:52:26 +00:00
|
|
|
namespace fom // file open mode
|
2015-04-24 21:38:11 +00:00
|
|
|
{
|
2015-08-12 01:52:26 +00:00
|
|
|
enum : u32
|
|
|
|
{
|
|
|
|
read = 1 << 0,
|
|
|
|
write = 1 << 1,
|
|
|
|
append = 1 << 2,
|
|
|
|
create = 1 << 3,
|
|
|
|
trunc = 1 << 4,
|
|
|
|
excl = 1 << 5,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class fse : u32 // filesystem (file or dir) error
|
|
|
|
{
|
|
|
|
ok, // no error
|
|
|
|
invalid_arguments,
|
|
|
|
};
|
|
|
|
|
2015-04-24 21:38:11 +00:00
|
|
|
namespace fs
|
|
|
|
{
|
2015-08-12 01:52:26 +00:00
|
|
|
thread_local extern fse g_tls_error;
|
|
|
|
|
2015-04-24 21:38:11 +00:00
|
|
|
struct stat_t
|
|
|
|
{
|
|
|
|
bool is_directory;
|
|
|
|
bool is_writable;
|
2015-04-25 19:15:53 +00:00
|
|
|
u64 size;
|
2015-08-12 01:52:26 +00:00
|
|
|
s64 atime;
|
|
|
|
s64 mtime;
|
|
|
|
s64 ctime;
|
2015-04-24 21:38:11 +00:00
|
|
|
};
|
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
// Get file information
|
2015-04-24 21:38:11 +00:00
|
|
|
bool stat(const std::string& path, stat_t& info);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Check whether a file or a directory exists (not recommended, use is_file() or is_dir() instead)
|
2015-04-24 21:38:11 +00:00
|
|
|
bool exists(const std::string& path);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Check whether the file exists and is NOT a directory
|
2015-04-24 21:38:11 +00:00
|
|
|
bool is_file(const std::string& file);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Check whether the directory exists and is NOT a file
|
2015-04-24 21:38:11 +00:00
|
|
|
bool is_dir(const std::string& dir);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Delete empty directory
|
2015-04-24 21:38:11 +00:00
|
|
|
bool remove_dir(const std::string& dir);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Create directory
|
2015-04-24 21:38:11 +00:00
|
|
|
bool create_dir(const std::string& dir);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Create directories
|
2015-04-24 21:38:11 +00:00
|
|
|
bool create_path(const std::string& path);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Rename (move) file or directory
|
2015-04-24 21:38:11 +00:00
|
|
|
bool rename(const std::string& from, const std::string& to);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Copy file contents
|
2015-04-24 21:38:11 +00:00
|
|
|
bool copy_file(const std::string& from, const std::string& to, bool overwrite);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Delete file
|
2015-04-24 21:38:11 +00:00
|
|
|
bool remove_file(const std::string& file);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Change file size (possibly appending zeros)
|
2015-04-25 19:15:53 +00:00
|
|
|
bool truncate_file(const std::string& file, u64 length);
|
2015-04-24 21:38:11 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
class file final
|
2015-04-24 21:38:11 +00:00
|
|
|
{
|
2015-08-19 11:04:58 +00:00
|
|
|
using handle_type = std::intptr_t;
|
2015-04-25 19:15:53 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
constexpr static handle_type null = -1;
|
2015-04-24 21:38:11 +00:00
|
|
|
|
2015-04-25 19:15:53 +00:00
|
|
|
handle_type m_fd = null;
|
2015-04-24 21:38:11 +00:00
|
|
|
|
|
|
|
public:
|
2015-04-25 19:15:53 +00:00
|
|
|
file() = default;
|
2015-04-24 21:38:11 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
explicit file(const std::string& filename, u32 mode = fom::read)
|
|
|
|
{
|
|
|
|
open(filename, mode);
|
|
|
|
}
|
2015-04-24 21:38:11 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
file(file&& other)
|
|
|
|
: m_fd(other.m_fd)
|
|
|
|
{
|
|
|
|
other.m_fd = null;
|
|
|
|
}
|
2015-04-24 21:38:11 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
file& operator =(file&& right)
|
|
|
|
{
|
|
|
|
std::swap(m_fd, right.m_fd);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
~file();
|
2015-04-24 21:38:11 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
// Check whether the handle is valid (opened file)
|
|
|
|
bool is_opened() const
|
|
|
|
{
|
|
|
|
return m_fd != null;
|
|
|
|
}
|
2015-04-24 21:38:11 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
// Check whether the handle is valid (opened file)
|
|
|
|
explicit operator bool() const
|
|
|
|
{
|
|
|
|
return is_opened();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Open specified file with specified mode
|
2015-08-12 01:52:26 +00:00
|
|
|
bool open(const std::string& filename, u32 mode = fom::read);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Change file size (possibly appending zero bytes)
|
|
|
|
bool trunc(u64 size) const;
|
|
|
|
|
|
|
|
// Get file information
|
|
|
|
bool stat(stat_t& info) const;
|
|
|
|
|
|
|
|
// Close the file explicitly (destructor automatically closes the file)
|
2015-04-24 21:38:11 +00:00
|
|
|
bool close();
|
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
// Read the data from the file and return the amount of data written in buffer
|
2015-04-24 21:38:11 +00:00
|
|
|
u64 read(void* buffer, u64 count) const;
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Write the data to the file and return the amount of data actually written
|
2015-04-24 21:38:11 +00:00
|
|
|
u64 write(const void* buffer, u64 count) const;
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Write std::string
|
|
|
|
u64 write(const std::string& string) const { return write(string.data(), string.size()); }
|
|
|
|
|
|
|
|
// Move file pointer
|
2015-08-12 01:52:26 +00:00
|
|
|
u64 seek(s64 offset, fsm seek_mode = fsm::begin) const;
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Get file size
|
2015-04-24 21:38:11 +00:00
|
|
|
u64 size() const;
|
|
|
|
};
|
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
class dir final
|
2015-04-25 19:15:53 +00:00
|
|
|
{
|
2015-09-26 20:46:04 +00:00
|
|
|
std::unique_ptr<char[]> m_path;
|
|
|
|
std::intptr_t m_dd; // handle (aux)
|
2015-04-25 19:15:53 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
dir() = default;
|
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
explicit dir(const std::string& dirname)
|
|
|
|
{
|
|
|
|
open(dirname);
|
|
|
|
}
|
2015-04-25 19:15:53 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
dir(dir&& other)
|
|
|
|
: m_dd(other.m_dd)
|
|
|
|
, m_path(std::move(other.m_path))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
dir& operator =(dir&& right)
|
|
|
|
{
|
|
|
|
m_dd = right.m_dd;
|
|
|
|
m_path = std::move(right.m_path);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
~dir();
|
2015-04-25 19:15:53 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
// Check whether the handle is valid (opened directory)
|
|
|
|
bool is_opened() const
|
|
|
|
{
|
|
|
|
return m_path.operator bool();
|
|
|
|
}
|
2015-04-25 19:15:53 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
// Check whether the handle is valid (opened directory)
|
|
|
|
explicit operator bool() const
|
|
|
|
{
|
|
|
|
return is_opened();
|
|
|
|
}
|
2015-04-25 19:15:53 +00:00
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
// Open specified directory
|
2015-04-25 19:15:53 +00:00
|
|
|
bool open(const std::string& dirname);
|
2015-09-26 20:46:04 +00:00
|
|
|
|
|
|
|
// Close the directory explicitly (destructor automatically closes the directory)
|
2015-04-25 19:15:53 +00:00
|
|
|
bool close();
|
|
|
|
|
2015-09-26 20:46:04 +00:00
|
|
|
// Get next directory entry (UTF-8 name and file stat)
|
|
|
|
bool read(std::string& name, stat_t& info);
|
2015-04-25 19:15:53 +00:00
|
|
|
};
|
|
|
|
}
|