diff --git a/interfaces/kits/js/src/mod_fs/properties/copy_file.cpp b/interfaces/kits/js/src/mod_fs/properties/copy_file.cpp index 15eb6ea4b48c658026f511854953f6783d04c753..aea538a410a383ec1602ae0aeb7a8338b8059c9e 100755 --- a/interfaces/kits/js/src/mod_fs/properties/copy_file.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy_file.cpp @@ -49,8 +49,9 @@ static NError IsAllPath(FileInfo& srcFile, FileInfo& destFile) return NError(ERRNO_NOERR); } -static NError SendFileCore(FileInfo& srcFdg, FileInfo& destFdg, struct stat& statbf) +static NError SendFileCore(FileInfo& srcFdg, FileInfo& destFdg, size_t size) { +#if !defined(IOS_PLATFORM) std::unique_ptr sendfile_req = { new (nothrow) uv_fs_t, CommonFunc::fs_req_cleanup }; if (!sendfile_req) { @@ -58,7 +59,6 @@ static NError SendFileCore(FileInfo& srcFdg, FileInfo& destFdg, struct stat& sta return NError(ENOMEM); } int64_t offset = 0; - size_t size = static_cast(statbf.st_size); int ret = 0; while (size > MAX_SIZE) { ret = uv_fs_sendfile(nullptr, sendfile_req.get(), destFdg.fdg->GetFD(), srcFdg.fdg->GetFD(), @@ -76,6 +76,45 @@ static NError SendFileCore(FileInfo& srcFdg, FileInfo& destFdg, struct stat& sta HILOGE("Failed to sendfile by ret : %{public}d", ret); return NError(ret); } +#else + std::unique_ptr read_req = { + new (nothrow) uv_fs_t, CommonFunc::fs_req_cleanup }; + if (!read_req) { + HILOGE("Failed to request heap memory."); + return NError(ENOMEM); + } + std::unique_ptr write_req = { + new (nothrow) uv_fs_t, CommonFunc::fs_req_cleanup }; + if (!write_req) { + HILOGE("Failed to request heap memory."); + return NError(ENOMEM); + } + auto copyBuf = CreateUniquePtr(COPY_BLOCK_SIZE); + uv_buf_t buffer = uv_buf_init(copyBuf.get(), COPY_BLOCK_SIZE); + int ret = -1; + int64_t offset = 0; + while (offset < size) { + ret = uv_fs_read(nullptr, read_req.get(), srcFdg.fdg->GetFD(), &buffer, 1, offset, nullptr); + if (ret < 0) { + return NError(ret); + } + if (read_req->result != COPY_BLOCK_SIZE) { + break; + } + ret = uv_fs_write(nullptr, write_req.get(), destFdg.fdg->GetFD(), &buffer, 1, -1, nullptr); + if (ret < 0) { + return NError(ret); + } + size -= COPY_BLOCK_SIZE; + } + if (read_req->result != 0) { + uv_buf_t remainBuf = uv_buf_init(copyBuf.get(), read_req->result); + ret = uv_fs_write(nullptr, write_req.get(), destFdg.fdg->GetFD(), &remainBuf, 1, -1, nullptr); + if (ret < 0) { + return NError(ret); + } + } +#endif return NError(ERRNO_NOERR); } @@ -146,7 +185,7 @@ static NError OpenFile(FileInfo& srcFile, FileInfo& destFile) return NError(errno); } } - return SendFileCore(srcFile, destFile, statbf); + return SendFileCore(srcFile, destFile, statbf.st_size); } static tuple ParseJsMode(napi_env env, const NFuncArg& funcArg) diff --git a/interfaces/kits/js/src/mod_fs/properties/copy_file.h b/interfaces/kits/js/src/mod_fs/properties/copy_file.h index 2801c4a43a9793bab23a910d6b0e41d78b9c9ab1..1327e69bcd2fbd9ed68a396a674295501e79174f 100755 --- a/interfaces/kits/js/src/mod_fs/properties/copy_file.h +++ b/interfaces/kits/js/src/mod_fs/properties/copy_file.h @@ -37,6 +37,7 @@ public: Para(FileInfo src, FileInfo dest) : src_(move(src)), dest_(move(dest)){}; }; constexpr size_t MAX_SIZE = 0x7ffff000; +constexpr size_t COPY_BLOCK_SIZE = 4096; const string PROCEDURE_COPYFILE_NAME = "FileIOCopyFile"; } // namespace ModuleFileIO } // namespace FileManagement