summaryrefslogtreecommitdiffstats
path: root/src/core/file_sys/vfs.cpp
diff options
context:
space:
mode:
authorZach Hilman <zachhilman@gmail.com>2018-09-20 03:55:47 +0200
committerZach Hilman <zachhilman@gmail.com>2018-09-22 01:53:05 +0200
commitf68e324672ba93cf932e64a05cbdad871cb6e235 (patch)
treee7944cc071d4655c8dfd48050b262620812a90f3 /src/core/file_sys/vfs.cpp
parentvfs: Add GetEntries method (diff)
downloadyuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.tar
yuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.tar.gz
yuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.tar.bz2
yuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.tar.lz
yuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.tar.xz
yuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.tar.zst
yuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.zip
Diffstat (limited to '')
-rw-r--r--src/core/file_sys/vfs.cpp36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/core/file_sys/vfs.cpp b/src/core/file_sys/vfs.cpp
index 1ddfb7600..218cfde66 100644
--- a/src/core/file_sys/vfs.cpp
+++ b/src/core/file_sys/vfs.cpp
@@ -463,13 +463,41 @@ bool DeepEquals(const VirtualFile& file1, const VirtualFile& file2, std::size_t
return true;
}
-bool VfsRawCopy(VirtualFile src, VirtualFile dest) {
- if (src == nullptr || dest == nullptr)
+bool VfsRawCopy(const VirtualFile& src, const VirtualFile& dest, size_t block_size) {
+ if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable())
return false;
if (!dest->Resize(src->GetSize()))
return false;
- std::vector<u8> data = src->ReadAllBytes();
- return dest->WriteBytes(data, 0) == data.size();
+
+ std::vector<u8> temp(std::min(block_size, src->GetSize()));
+ for (size_t i = 0; i < src->GetSize(); i += block_size) {
+ const auto read = std::min(block_size, src->GetSize() - i);
+ const auto block = src->Read(temp.data(), read, i);
+
+ if (dest->Write(temp.data(), read, i) != read)
+ return false;
+ }
+
+ return true;
+}
+
+bool VfsRawCopyD(const VirtualDir& src, const VirtualDir& dest, size_t block_size) {
+ if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable())
+ return false;
+
+ for (const auto& file : src->GetFiles()) {
+ const auto out = dest->CreateFile(file->GetName());
+ if (!VfsRawCopy(file, out, block_size))
+ return false;
+ }
+
+ for (const auto& dir : src->GetSubdirectories()) {
+ const auto out = dest->CreateSubdirectory(dir->GetName());
+ if (!VfsRawCopyD(dir, out, block_size))
+ return false;
+ }
+
+ return true;
}
VirtualDir GetOrCreateDirectoryRelative(const VirtualDir& rel, std::string_view path) {