diff --git a/frameworks/native/backup_ext/src/tar_file.cpp b/frameworks/native/backup_ext/src/tar_file.cpp index 33886e549d642afc23fd9b4d3dfe4bd211747923..c5117569c1032d437b8a55856a2f6e08c5eda0dd 100644 --- a/frameworks/native/backup_ext/src/tar_file.cpp +++ b/frameworks/native/backup_ext/src/tar_file.cpp @@ -213,34 +213,35 @@ bool TarFile::AddFile(string &fileName, const struct stat &st, bool isSplit) bool TarFile::WriteFileContent(const string &fileName, off_t size) { - int fd = open(fileName.c_str(), O_RDONLY | O_CLOEXEC); - if (fd < 0) { + FILE *fd = fopen(fileName.c_str(), "rb"); + if (fd == nullptr) { HILOGE("Failed to open file %{public}s, err = %{public}d", fileName.data(), errno); return false; } off_t remain = size; bool isFilled = false; + vector ioBuffer {}; + off_t read = READ_BUFF_SIZE; + ioBuffer.resize(read); while (remain > 0) { - off_t read = ioBuffer_.size(); if (remain < read) { read = remain; } // read buffer from src file - if (ReadAll(fd, ioBuffer_, read) != read) { - HILOGE("Failed to read all"); + if (fread(&ioBuffer[0], sizeof(uint8_t), read, fd) != static_cast(read)) { + HILOGE("Failed to split open filename."); break; } - // write buffer to tar file - if (SplitWriteAll(ioBuffer_, read) != read) { + if (SplitWriteAll(ioBuffer, read) != read) { HILOGE("Failed to split write all"); break; } remain -= read; } - close(fd); + (void)fclose(fd); if (remain == 0) { if (!isFilled) { return CompleteBlock(size); @@ -261,12 +262,8 @@ off_t TarFile::SplitWriteAll(const vector &ioBuffer, off_t read) while (count < len) { auto writeBytes = fwrite(&ioBuffer[count], sizeof(uint8_t), len - count, currentTarFile_); if (writeBytes < 1) { - // 再执行一遍 - auto writeBytes = fwrite(&ioBuffer[count], sizeof(uint8_t), len - count, currentTarFile_); - if (writeBytes < 1) { - HILOGE("Failed to fwrite tar file, err = %{public}d", errno); - return count; - } + HILOGE("Failed to fwrite tar file, err = %{public}d", errno); + continue; } count += writeBytes; currentTarFileSize_ += writeBytes; @@ -421,7 +418,7 @@ int TarFile::WriteAll(const vector &buf, size_t len) auto i = fwrite(&buf[0] + count, sizeof(uint8_t), len - count, currentTarFile_); if (i < 1) { HILOGE("Failed to fwrite tar file, err = %{public}d", errno); - return count; + continue; } count += i; currentTarFileSize_ += i;