rpcs3/Utilities/File.h

196 lines
3.9 KiB
C
Raw Normal View History

2015-04-24 21:38:11 +00:00
#pragma once
enum class fsm : u32 // file seek mode
2015-04-24 21:38:11 +00:00
{
begin,
cur,
end,
2015-04-24 21:38:11 +00:00
};
namespace fom // file open mode
2015-04-24 21:38:11 +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
{
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;
s64 atime;
s64 mtime;
s64 ctime;
2015-04-24 21:38:11 +00:00
};
// Get file information
2015-04-24 21:38:11 +00:00
bool stat(const std::string& path, stat_t& info);
// 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);
// 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);
// 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);
// Delete empty directory
2015-04-24 21:38:11 +00:00
bool remove_dir(const std::string& dir);
// Create directory
2015-04-24 21:38:11 +00:00
bool create_dir(const std::string& dir);
// Create directories
2015-04-24 21:38:11 +00:00
bool create_path(const std::string& path);
// Rename (move) file or directory
2015-04-24 21:38:11 +00:00
bool rename(const std::string& from, const std::string& to);
// Copy file contents
2015-04-24 21:38:11 +00:00
bool copy_file(const std::string& from, const std::string& to, bool overwrite);
// Delete file
2015-04-24 21:38:11 +00:00
bool remove_file(const std::string& file);
// 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
class file final
2015-04-24 21:38:11 +00:00
{
using handle_type = std::intptr_t;
2015-04-25 19:15:53 +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
explicit file(const std::string& filename, u32 mode = fom::read)
{
open(filename, mode);
}
2015-04-24 21:38:11 +00:00
file(file&& other)
: m_fd(other.m_fd)
{
other.m_fd = null;
}
2015-04-24 21:38:11 +00:00
file& operator =(file&& right)
{
std::swap(m_fd, right.m_fd);
return *this;
}
~file();
2015-04-24 21:38:11 +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
// Check whether the handle is valid (opened file)
explicit operator bool() const
{
return is_opened();
}
// Open specified file with specified mode
bool open(const std::string& filename, u32 mode = fom::read);
// 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();
// 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;
// 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;
// Write std::string
u64 write(const std::string& string) const { return write(string.data(), string.size()); }
// Move file pointer
u64 seek(s64 offset, fsm seek_mode = fsm::begin) const;
// Get file size
2015-04-24 21:38:11 +00:00
u64 size() const;
};
class dir final
2015-04-25 19:15:53 +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;
explicit dir(const std::string& dirname)
{
open(dirname);
}
2015-04-25 19:15:53 +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
// 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
// Check whether the handle is valid (opened directory)
explicit operator bool() const
{
return is_opened();
}
2015-04-25 19:15:53 +00:00
// Open specified directory
2015-04-25 19:15:53 +00:00
bool open(const std::string& dirname);
// Close the directory explicitly (destructor automatically closes the directory)
2015-04-25 19:15:53 +00:00
bool close();
// 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
};
}