ResultCode SaveDataArchive::CreateFile(const FileSys::Path& path, u64 size) const { const PathParser path_parser(path); if (!path_parser.IsValid()) { LOG_ERROR(Service_FS, "Invalid path {}", path.DebugStr()); return ERROR_INVALID_PATH; } const auto full_path = path_parser.BuildHostPath(mount_point); switch (path_parser.GetHostStatus(mount_point)) { case PathParser::InvalidMountPoint: LOG_CRITICAL(Service_FS, "(unreachable) Invalid mount point {}", mount_point); return ERROR_FILE_NOT_FOUND; case PathParser::PathNotFound: LOG_ERROR(Service_FS, "Path not found {}", full_path); return ERROR_PATH_NOT_FOUND; case PathParser::FileInPath: LOG_ERROR(Service_FS, "Unexpected file in path {}", full_path); return ERROR_UNEXPECTED_FILE_OR_DIRECTORY; case PathParser::DirectoryFound: case PathParser::FileFound: LOG_ERROR(Service_FS, "{} already exists", full_path); return ERROR_FILE_ALREADY_EXISTS; case PathParser::NotFound: break; // Expected 'success' case } 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; } LOG_ERROR(Service_FS, "Too large file"); return ResultCode(ErrorDescription::TooLarge, ErrorModule::FS, ErrorSummary::OutOfResource, ErrorLevel::Info); }
ResultCode DiskArchive::CreateFile(const FileSys::Path& path, u32 size) const { std::string full_path = mount_point + 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); }
/** * Delete a directory specified by its path * @param path Path relative to the archive * @return Whether the directory could be deleted */ bool Archive_SDMC::DeleteDirectory(const FileSys::Path& path) const { return FileUtil::DeleteDir(GetMountPoint() + path.AsString()); }
bool Archive_SDMC::RenameDirectory(const FileSys::Path& src_path, const FileSys::Path& dest_path) const { return FileUtil::Rename(GetMountPoint() + src_path.AsString(), GetMountPoint() + dest_path.AsString()); }