25 : filename(
std::move(filename_))
35 if (
auto pos = filename.find_last_of(
'/'); pos != std::string::npos) {
64 "File \"", filename,
"\" not found");
67 "Error opening file \"", filename,
"\": ",
75 : filename(
std::move(filename_))
84 assert(strchr(mode,
'b'));
105 if (fread(buffer.data(), 1, buffer.size(), file.get()) != buffer.size()) {
106 if (ferror(file.get())) {
109 if (feof(file.get())) {
117 if (fwrite(buffer.data(), 1, buffer.size(), file.get()) != buffer.size()) {
118 if (ferror(file.get())) {
128 if (
size == 0)
return {
static_cast<uint8_t*
>(
nullptr),
size};
131 int fd = _fileno(file.get());
133 throw FileException(
"_fileno failed");
135 auto hFile =
reinterpret_cast<HANDLE
>(_get_osfhandle(fd));
136 if (hFile == INVALID_HANDLE_VALUE) {
137 throw FileException(
"_get_osfhandle failed");
140 hMmap = CreateFileMapping(hFile,
nullptr, PAGE_WRITECOPY, 0, 0,
nullptr);
143 "CreateFileMapping failed: ", GetLastError());
145 mmem =
static_cast<uint8_t*
>(MapViewOfFile(hMmap, FILE_MAP_COPY, 0, 0, 0));
147 DWORD gle = GetLastError();
150 throw FileException(
"MapViewOfFile failed: ", gle);
166 if (!UnmapViewOfFile(mmem)) {
167 std::cerr <<
"UnmapViewOfFile failed: "
183 if (
size == 0)
return {
static_cast<uint8_t*
>(
nullptr),
size};
186 mmem =
static_cast<uint8_t*
>(
188 MAP_PRIVATE, fileno(file.get()), 0));
191 auto* MY_MAP_FAILED =
reinterpret_cast<void*
>(-1);
192 if (mmem == MY_MAP_FAILED) {
219 int ret = _fstat64(fileno(file.get()), &st);
222 int ret = fstat(fileno(file.get()), &st);
223 if (ret && (errno == EOVERFLOW)) {
227 "32-bit platforms: ",
getURL());
239 int ret = _fseeki64(file.get(), pos, SEEK_SET);
241 int ret = fseek(file.get(), narrow_cast<long>(pos), SEEK_SET);
250 return ftell(file.get());
256 int fd = fileno(file.get());
257 if (ftruncate(fd, narrow_cast<off_t>(
size))) {
289 int ret = _fstat64(fileno(file.get()), &st);
292 int ret = fstat(fileno(file.get()), &st);
time_t getModificationDate() override
void write(std::span< const uint8_t > buffer) override
void read(std::span< uint8_t > buffer) override
void seek(size_t pos) override
bool isReadOnly() const override
LocalFile(std::string filename, File::OpenMode mode)
void truncate(size_t size) override
std::string getLocalReference() override
std::span< const uint8_t > mmap() override
const std::string & getURL() const override
size_t getSize() override
const std::string & getNativePath(const std::string &path)
Returns the path in native path-delimiter.
FILE_t openFile(zstring_view filename, zstring_view mode)
Call fopen() in a platform-independent manner.
void mkdirp(string path)
Acts like the unix command "mkdir -p".
This file implemented 3 utility functions:
size_t size(std::string_view utf8)