diff options
author | bunnei <bunneidev@gmail.com> | 2014-12-21 01:45:00 -0500 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2014-12-21 01:45:00 -0500 |
commit | 572ce043c291f46f50d97f68f4df4f6f93e72035 (patch) | |
tree | 79a59fa757424e053b029b6162937551a03d1e25 /src/core/file_sys/disk_archive.cpp | |
parent | 0f696037f6ce7fabaa3af45eeef2461390b8b64d (diff) | |
parent | 0625dd09eaf9158696a9255cb6c6b2bd73122301 (diff) |
Merge pull request #271 from archshift/createf
Added CreateFile to the FS_USER service
Diffstat (limited to 'src/core/file_sys/disk_archive.cpp')
-rw-r--r-- | src/core/file_sys/disk_archive.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/core/file_sys/disk_archive.cpp b/src/core/file_sys/disk_archive.cpp index eabf5805..f8096ebc 100644 --- a/src/core/file_sys/disk_archive.cpp +++ b/src/core/file_sys/disk_archive.cpp @@ -35,6 +35,27 @@ bool DiskArchive::DeleteDirectory(const FileSys::Path& path) const { return FileUtil::DeleteDir(GetMountPoint() + path.AsString()); } +ResultCode DiskArchive::CreateFile(const FileSys::Path& path, u32 size) const { + std::string full_path = GetMountPoint() + path.AsString(); + + if (FileUtil::Exists(full_path)) + return ResultCode(ErrorDescription::AlreadyExists, ErrorModule::FS, ErrorSummary::NothingHappened, ErrorLevel::Info); + + if (size == 0) { + FileUtil::CreateEmptyFile(full_path); + return RESULT_SUCCESS; + } + + FileUtil::IOFile file(full_path, "wb"); + // Creates a sparse file (or a normal file on filesystems without the concept of sparse files) + // We do this by seeking to the right size, then writing a single null byte. + if (file.Seek(size - 1, SEEK_SET) && file.WriteBytes("", 1) == 1) + return RESULT_SUCCESS; + + return ResultCode(ErrorDescription::TooLarge, ErrorModule::FS, ErrorSummary::OutOfResource, ErrorLevel::Info); +} + + bool DiskArchive::CreateDirectory(const Path& path) const { return FileUtil::CreateDir(GetMountPoint() + path.AsString()); } |