154aa6d63Sopenharmony_ci/* 254aa6d63Sopenharmony_ci * Copyright (c) 2024-2024 Huawei Device Co., Ltd. 354aa6d63Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 454aa6d63Sopenharmony_ci * you may not use this file except in compliance with the License. 554aa6d63Sopenharmony_ci * You may obtain a copy of the License at 654aa6d63Sopenharmony_ci * 754aa6d63Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 854aa6d63Sopenharmony_ci * 954aa6d63Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1054aa6d63Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1154aa6d63Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1254aa6d63Sopenharmony_ci * See the License for the specific language governing permissions and 1354aa6d63Sopenharmony_ci * limitations under the License. 1454aa6d63Sopenharmony_ci */ 1554aa6d63Sopenharmony_ci#include <iostream> 1654aa6d63Sopenharmony_ci#include <filesystem> 1754aa6d63Sopenharmony_ci#include <fstream> 1854aa6d63Sopenharmony_ci#include <climits> 1954aa6d63Sopenharmony_ci 2054aa6d63Sopenharmony_ci#include "string_utils.h" 2154aa6d63Sopenharmony_ci#include "signature_tools_errno.h" 2254aa6d63Sopenharmony_ci#include "file_utils.h" 2354aa6d63Sopenharmony_ci 2454aa6d63Sopenharmony_cinamespace OHOS { 2554aa6d63Sopenharmony_cinamespace SignatureTools { 2654aa6d63Sopenharmony_cinamespace fs = std::filesystem; 2754aa6d63Sopenharmony_ci 2854aa6d63Sopenharmony_ciconst int FileUtils::NUM_TWO = 2; 2954aa6d63Sopenharmony_ciconst int FileUtils::NUM_THREE = 3; 3054aa6d63Sopenharmony_ciconst int FileUtils::NUM_FOUR = 4; 3154aa6d63Sopenharmony_ciconst std::string FileUtils::LIBS_PATH_PREFIX = "libs/"; 3254aa6d63Sopenharmony_cibool FileUtils::IsEmpty(std::string cs) 3354aa6d63Sopenharmony_ci{ 3454aa6d63Sopenharmony_ci if (cs.length() == 0) { 3554aa6d63Sopenharmony_ci return true; 3654aa6d63Sopenharmony_ci } 3754aa6d63Sopenharmony_ci return false; 3854aa6d63Sopenharmony_ci} 3954aa6d63Sopenharmony_ci 4054aa6d63Sopenharmony_cibool FileUtils::IsSpaceEnough(const std::string& filePath, const int64_t requiredSpace) 4154aa6d63Sopenharmony_ci{ 4254aa6d63Sopenharmony_ci uint64_t freeSpace = 0; 4354aa6d63Sopenharmony_ci struct statfs diskStatfs; 4454aa6d63Sopenharmony_ci int ret = statfs(filePath.c_str(), &diskStatfs); 4554aa6d63Sopenharmony_ci if (ret >= 0) { 4654aa6d63Sopenharmony_ci freeSpace = (uint64_t)diskStatfs.f_bsize * (uint64_t)diskStatfs.f_bavail; 4754aa6d63Sopenharmony_ci } else { 4854aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("statfs fail, error code = %d", ret); 4954aa6d63Sopenharmony_ci } 5054aa6d63Sopenharmony_ci return freeSpace >= static_cast<uint64_t>(requiredSpace); 5154aa6d63Sopenharmony_ci} 5254aa6d63Sopenharmony_ci 5354aa6d63Sopenharmony_cistd::string FileUtils::GetSuffix(std::string filePath) 5454aa6d63Sopenharmony_ci{ 5554aa6d63Sopenharmony_ci if (filePath.empty()) { 5654aa6d63Sopenharmony_ci return ""; 5754aa6d63Sopenharmony_ci } 5854aa6d63Sopenharmony_ci size_t lastDotPosition = filePath.rfind("."); 5954aa6d63Sopenharmony_ci bool positionFlag = (lastDotPosition == std::string::npos) || (lastDotPosition == filePath.size() - 1); 6054aa6d63Sopenharmony_ci if (positionFlag) { 6154aa6d63Sopenharmony_ci return ""; 6254aa6d63Sopenharmony_ci } 6354aa6d63Sopenharmony_ci return filePath.substr(lastDotPosition + 1); 6454aa6d63Sopenharmony_ci} 6554aa6d63Sopenharmony_ci 6654aa6d63Sopenharmony_cibool FileUtils::ValidFileType(const std::string& filePath, const std::initializer_list<std::string> types) 6754aa6d63Sopenharmony_ci{ 6854aa6d63Sopenharmony_ci std::string suffix = GetSuffix(filePath); 6954aa6d63Sopenharmony_ci bool flag = suffix.empty() || (StringUtils::ContainsCase(types, suffix) == false); 7054aa6d63Sopenharmony_ci if (flag) { 7154aa6d63Sopenharmony_ci PrintErrorNumberMsg("NOT_SUPPORT_ERROR", NOT_SUPPORT_ERROR, "Not support file: " + filePath); 7254aa6d63Sopenharmony_ci return false; 7354aa6d63Sopenharmony_ci } 7454aa6d63Sopenharmony_ci return true; 7554aa6d63Sopenharmony_ci} 7654aa6d63Sopenharmony_ci 7754aa6d63Sopenharmony_ciint FileUtils::Write(const std::string& content, const std::string& output) 7854aa6d63Sopenharmony_ci{ 7954aa6d63Sopenharmony_ci std::ofstream outFile(output, std::ios::binary); 8054aa6d63Sopenharmony_ci bool flag = (outFile.rdstate() != 0); 8154aa6d63Sopenharmony_ci if (flag) { 8254aa6d63Sopenharmony_ci PrintErrorNumberMsg("IO_ERROR", IO_ERROR, "open output file: " + output + " failed"); 8354aa6d63Sopenharmony_ci return IO_ERROR; 8454aa6d63Sopenharmony_ci } 8554aa6d63Sopenharmony_ci outFile.write(&content[0], content.size()); 8654aa6d63Sopenharmony_ci if (outFile.rdstate() != 0) { 8754aa6d63Sopenharmony_ci PrintErrorNumberMsg("IO_ERROR", IO_ERROR, "Failed to write data to output stream."); 8854aa6d63Sopenharmony_ci return IO_ERROR; 8954aa6d63Sopenharmony_ci } 9054aa6d63Sopenharmony_ci return RET_OK; 9154aa6d63Sopenharmony_ci} 9254aa6d63Sopenharmony_ci 9354aa6d63Sopenharmony_ciint FileUtils::Read(std::ifstream& input, std::string& ret) 9454aa6d63Sopenharmony_ci{ 9554aa6d63Sopenharmony_ci ret.clear(); 9654aa6d63Sopenharmony_ci if (input.rdstate() != 0) { 9754aa6d63Sopenharmony_ci PrintErrorNumberMsg("IO_ERROR", IO_ERROR, "invalid input stream"); 9854aa6d63Sopenharmony_ci return IO_ERROR; 9954aa6d63Sopenharmony_ci } 10054aa6d63Sopenharmony_ci ret.clear(); 10154aa6d63Sopenharmony_ci std::string buffer(FileUtils::FILE_BUFFER_BLOCK, 0); 10254aa6d63Sopenharmony_ci while (input) { 10354aa6d63Sopenharmony_ci input.read(&buffer[0], buffer.size()); 10454aa6d63Sopenharmony_ci ret.append(&buffer[0], input.gcount()); 10554aa6d63Sopenharmony_ci } 10654aa6d63Sopenharmony_ci return RET_OK; 10754aa6d63Sopenharmony_ci} 10854aa6d63Sopenharmony_ci 10954aa6d63Sopenharmony_ciint FileUtils::ReadFile(const std::string& path, std::string& ret) 11054aa6d63Sopenharmony_ci{ 11154aa6d63Sopenharmony_ci std::ifstream file(path, std::ios::binary); 11254aa6d63Sopenharmony_ci bool flag = (file.rdstate() != 0); 11354aa6d63Sopenharmony_ci if (flag) { 11454aa6d63Sopenharmony_ci PrintErrorNumberMsg("IO_ERROR", IO_ERROR, "open input file: " + path + " failed"); 11554aa6d63Sopenharmony_ci return IO_ERROR; 11654aa6d63Sopenharmony_ci } 11754aa6d63Sopenharmony_ci if (Read(file, ret) < 0) { 11854aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("read error!"); 11954aa6d63Sopenharmony_ci return IO_ERROR; 12054aa6d63Sopenharmony_ci } 12154aa6d63Sopenharmony_ci return RET_OK; 12254aa6d63Sopenharmony_ci} 12354aa6d63Sopenharmony_ci 12454aa6d63Sopenharmony_ciint FileUtils::ReadFileByOffsetAndLength(std::ifstream& file, size_t offset, size_t length, std::string& ret) 12554aa6d63Sopenharmony_ci{ 12654aa6d63Sopenharmony_ci if (length > INT_MAX) { 12754aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Size cannot be greater than Integer max value: %zu", length); 12854aa6d63Sopenharmony_ci return RET_FAILED; 12954aa6d63Sopenharmony_ci } 13054aa6d63Sopenharmony_ci if (ReadInputByOffsetAndLength(file, offset, length, ret) < 0) { 13154aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Error readInputByOffsetAndLength"); 13254aa6d63Sopenharmony_ci return IO_ERROR; 13354aa6d63Sopenharmony_ci } 13454aa6d63Sopenharmony_ci return RET_OK; 13554aa6d63Sopenharmony_ci} 13654aa6d63Sopenharmony_ci 13754aa6d63Sopenharmony_ciint FileUtils::ReadInputByOffsetAndLength(std::ifstream& input, size_t offset, size_t length, std::string& ret) 13854aa6d63Sopenharmony_ci{ 13954aa6d63Sopenharmony_ci if (length > INT_MAX) { 14054aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Size cannot be greater than Integer max value: %zu", length); 14154aa6d63Sopenharmony_ci return -1; 14254aa6d63Sopenharmony_ci } 14354aa6d63Sopenharmony_ci input.seekg(offset); 14454aa6d63Sopenharmony_ci if (ReadInputByLength(input, length, ret) < 0) { 14554aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Error readInputByLength"); 14654aa6d63Sopenharmony_ci return -1; 14754aa6d63Sopenharmony_ci } 14854aa6d63Sopenharmony_ci return RET_OK; 14954aa6d63Sopenharmony_ci} 15054aa6d63Sopenharmony_ci 15154aa6d63Sopenharmony_ciint FileUtils::ReadInputByLength(std::ifstream& input, size_t length, std::string& ret) 15254aa6d63Sopenharmony_ci{ 15354aa6d63Sopenharmony_ci if (length > INT_MAX) { 15454aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Size cannot be greater than Integer max value: %zu", length); 15554aa6d63Sopenharmony_ci return -1; 15654aa6d63Sopenharmony_ci } 15754aa6d63Sopenharmony_ci if (input.rdstate() != 0) { 15854aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Error input"); 15954aa6d63Sopenharmony_ci return -1; 16054aa6d63Sopenharmony_ci } 16154aa6d63Sopenharmony_ci ret.clear(); 16254aa6d63Sopenharmony_ci std::string buffer(FILE_BUFFER_BLOCK, 0); 16354aa6d63Sopenharmony_ci size_t hasReadLen = 0; 16454aa6d63Sopenharmony_ci while (hasReadLen < length && input) { 16554aa6d63Sopenharmony_ci int readLen = static_cast<int>(std::min(length - hasReadLen, (size_t)FILE_BUFFER_BLOCK)); 16654aa6d63Sopenharmony_ci input.read(&buffer[0], readLen); 16754aa6d63Sopenharmony_ci bool flag = (input.gcount() != readLen); 16854aa6d63Sopenharmony_ci if (flag) { 16954aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("read %zu bytes data less than %zu", hasReadLen, length); 17054aa6d63Sopenharmony_ci return -1; 17154aa6d63Sopenharmony_ci } 17254aa6d63Sopenharmony_ci ret.append(&buffer[0], readLen); 17354aa6d63Sopenharmony_ci hasReadLen += input.gcount(); 17454aa6d63Sopenharmony_ci } 17554aa6d63Sopenharmony_ci if (hasReadLen != length) { 17654aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("read %zu bytes data less than %zu", hasReadLen, length); 17754aa6d63Sopenharmony_ci return -1; 17854aa6d63Sopenharmony_ci } 17954aa6d63Sopenharmony_ci return RET_OK; 18054aa6d63Sopenharmony_ci} 18154aa6d63Sopenharmony_ci 18254aa6d63Sopenharmony_cibool FileUtils::AppendWriteFileByOffsetToFile(std::ifstream& input, std::ofstream& out, size_t offset, size_t size) 18354aa6d63Sopenharmony_ci{ 18454aa6d63Sopenharmony_ci if (input.rdstate() != 0) { 18554aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("input failed."); 18654aa6d63Sopenharmony_ci return false; 18754aa6d63Sopenharmony_ci } 18854aa6d63Sopenharmony_ci if (out.rdstate() != 0) { 18954aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed get out stream"); 19054aa6d63Sopenharmony_ci return false; 19154aa6d63Sopenharmony_ci } 19254aa6d63Sopenharmony_ci input.seekg(offset); 19354aa6d63Sopenharmony_ci if (WriteInputToOutPut(input, out, size) < 0) { 19454aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Error: writeInputToOutPut"); 19554aa6d63Sopenharmony_ci return false; 19654aa6d63Sopenharmony_ci } 19754aa6d63Sopenharmony_ci return true; 19854aa6d63Sopenharmony_ci} 19954aa6d63Sopenharmony_ci 20054aa6d63Sopenharmony_cibool FileUtils::AppendWriteFileToFile(const std::string& inputFile, const std::string& outputFile) 20154aa6d63Sopenharmony_ci{ 20254aa6d63Sopenharmony_ci std::ifstream input(inputFile, std::ios::binary); 20354aa6d63Sopenharmony_ci std::ofstream output(outputFile, std::ios::binary | std::ios::app); 20454aa6d63Sopenharmony_ci bool flag = (0 != input.rdstate()); 20554aa6d63Sopenharmony_ci if (flag) { 20654aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to get input stream object!"); 20754aa6d63Sopenharmony_ci return false; 20854aa6d63Sopenharmony_ci } 20954aa6d63Sopenharmony_ci flag = (0 != output.rdstate()); 21054aa6d63Sopenharmony_ci if (flag) { 21154aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to get output stream object!"); 21254aa6d63Sopenharmony_ci return false; 21354aa6d63Sopenharmony_ci } 21454aa6d63Sopenharmony_ci char* buffer = new char[FILE_BUFFER_BLOCK]; 21554aa6d63Sopenharmony_ci while (!input.eof()) { 21654aa6d63Sopenharmony_ci input.read(buffer, FILE_BUFFER_BLOCK); 21754aa6d63Sopenharmony_ci 21854aa6d63Sopenharmony_ci if (input.fail() && !input.eof()) { 21954aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("error occurred while reading data"); 22054aa6d63Sopenharmony_ci delete[]buffer; 22154aa6d63Sopenharmony_ci return false; 22254aa6d63Sopenharmony_ci } 22354aa6d63Sopenharmony_ci std::streamsize readLen = input.gcount(); 22454aa6d63Sopenharmony_ci if (readLen > 0) { 22554aa6d63Sopenharmony_ci output.write(buffer, readLen); 22654aa6d63Sopenharmony_ci } 22754aa6d63Sopenharmony_ci if (!output) { 22854aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("error occurred while writing data"); 22954aa6d63Sopenharmony_ci delete[]buffer; 23054aa6d63Sopenharmony_ci return false; 23154aa6d63Sopenharmony_ci } 23254aa6d63Sopenharmony_ci } 23354aa6d63Sopenharmony_ci delete[]buffer; 23454aa6d63Sopenharmony_ci return true; 23554aa6d63Sopenharmony_ci} 23654aa6d63Sopenharmony_ci 23754aa6d63Sopenharmony_cibool FileUtils::AppendWriteByteToFile(const std::string& bytes, const std::string& outputFile) 23854aa6d63Sopenharmony_ci{ 23954aa6d63Sopenharmony_ci std::ofstream output(outputFile, std::ios::binary | std::ios::app); 24054aa6d63Sopenharmony_ci bool flag = (WriteByteToOutFile(bytes, output) == false); 24154aa6d63Sopenharmony_ci if (flag) { 24254aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to write data to output stream, outfile: %s", outputFile.c_str()); 24354aa6d63Sopenharmony_ci return false; 24454aa6d63Sopenharmony_ci } 24554aa6d63Sopenharmony_ci return true; 24654aa6d63Sopenharmony_ci} 24754aa6d63Sopenharmony_ci 24854aa6d63Sopenharmony_ciint FileUtils::WriteInputToOutPut(std::ifstream& input, std::ofstream& output, size_t length) 24954aa6d63Sopenharmony_ci{ 25054aa6d63Sopenharmony_ci static Uscript::ThreadPool readPool(1); 25154aa6d63Sopenharmony_ci static Uscript::ThreadPool writePool(1); 25254aa6d63Sopenharmony_ci std::future<void> readTask; 25354aa6d63Sopenharmony_ci std::vector<std::future<void>> writeTasks; 25454aa6d63Sopenharmony_ci int result = RET_OK; 25554aa6d63Sopenharmony_ci auto writeFunc = [&result] (std::ofstream& outStream, char* data, int dataSize) { 25654aa6d63Sopenharmony_ci outStream.write(data, dataSize); 25754aa6d63Sopenharmony_ci if (!outStream.good()) { 25854aa6d63Sopenharmony_ci result = IO_ERROR; 25954aa6d63Sopenharmony_ci delete[] data; 26054aa6d63Sopenharmony_ci return; 26154aa6d63Sopenharmony_ci } 26254aa6d63Sopenharmony_ci delete[] data; 26354aa6d63Sopenharmony_ci }; 26454aa6d63Sopenharmony_ci auto readFunc = [&output, &writeFunc, &writeTasks, &result] (std::ifstream& in, int dataSize) { 26554aa6d63Sopenharmony_ci while (in) { 26654aa6d63Sopenharmony_ci char* buf = new (std::nothrow)char[FILE_BUFFER_BLOCK]; 26754aa6d63Sopenharmony_ci if (buf == NULL) { 26854aa6d63Sopenharmony_ci result = RET_FAILED; 26954aa6d63Sopenharmony_ci return; 27054aa6d63Sopenharmony_ci } 27154aa6d63Sopenharmony_ci int min = std::min(dataSize, FILE_BUFFER_BLOCK); 27254aa6d63Sopenharmony_ci in.read(buf, min); 27354aa6d63Sopenharmony_ci dataSize -= in.gcount(); 27454aa6d63Sopenharmony_ci writeTasks.push_back(writePool.Enqueue(writeFunc, std::ref(output), buf, min)); 27554aa6d63Sopenharmony_ci if (dataSize <= 0) { 27654aa6d63Sopenharmony_ci break; 27754aa6d63Sopenharmony_ci } 27854aa6d63Sopenharmony_ci } 27954aa6d63Sopenharmony_ci // After the file is written, datasize must be 0, so the if condition will never hold 28054aa6d63Sopenharmony_ci if (dataSize != 0) { 28154aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("write error!"); 28254aa6d63Sopenharmony_ci result = IO_ERROR; 28354aa6d63Sopenharmony_ci return; 28454aa6d63Sopenharmony_ci } 28554aa6d63Sopenharmony_ci }; 28654aa6d63Sopenharmony_ci readTask = readPool.Enqueue(readFunc, std::ref(input), length); 28754aa6d63Sopenharmony_ci readTask.wait(); 28854aa6d63Sopenharmony_ci for (std::future<void>& task : writeTasks) { 28954aa6d63Sopenharmony_ci task.wait(); 29054aa6d63Sopenharmony_ci } 29154aa6d63Sopenharmony_ci return result; 29254aa6d63Sopenharmony_ci} 29354aa6d63Sopenharmony_ci 29454aa6d63Sopenharmony_cibool FileUtils::WriteInputToOutPut(const std::string& input, const std::string& output) 29554aa6d63Sopenharmony_ci{ 29654aa6d63Sopenharmony_ci std::ifstream in(input, std::ios::binary); 29754aa6d63Sopenharmony_ci std::ofstream out(output, std::ios::binary); 29854aa6d63Sopenharmony_ci bool flag = (in.rdstate() != 0); 29954aa6d63Sopenharmony_ci if (flag) { 30054aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to get input stream object!"); 30154aa6d63Sopenharmony_ci return false; 30254aa6d63Sopenharmony_ci } 30354aa6d63Sopenharmony_ci flag = (out.rdstate() != 0); 30454aa6d63Sopenharmony_ci if (flag) { 30554aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to get output stream object!"); 30654aa6d63Sopenharmony_ci return false; 30754aa6d63Sopenharmony_ci } 30854aa6d63Sopenharmony_ci char* buffer = new char[FILE_BUFFER_BLOCK]; 30954aa6d63Sopenharmony_ci while (!in.eof()) { 31054aa6d63Sopenharmony_ci in.read(buffer, FILE_BUFFER_BLOCK); 31154aa6d63Sopenharmony_ci 31254aa6d63Sopenharmony_ci if (in.fail() && !in.eof()) { 31354aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("error occurred while reading data"); 31454aa6d63Sopenharmony_ci delete[]buffer; 31554aa6d63Sopenharmony_ci return false; 31654aa6d63Sopenharmony_ci } 31754aa6d63Sopenharmony_ci 31854aa6d63Sopenharmony_ci std::streamsize readLen = in.gcount(); 31954aa6d63Sopenharmony_ci if (readLen > 0) { 32054aa6d63Sopenharmony_ci out.write(buffer, readLen); 32154aa6d63Sopenharmony_ci } 32254aa6d63Sopenharmony_ci 32354aa6d63Sopenharmony_ci if (!out) { 32454aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("error occurred while writing data"); 32554aa6d63Sopenharmony_ci delete[]buffer; 32654aa6d63Sopenharmony_ci return false; 32754aa6d63Sopenharmony_ci } 32854aa6d63Sopenharmony_ci } 32954aa6d63Sopenharmony_ci delete[]buffer; 33054aa6d63Sopenharmony_ci return true; 33154aa6d63Sopenharmony_ci} 33254aa6d63Sopenharmony_ci 33354aa6d63Sopenharmony_cibool FileUtils::WriteByteToOutFile(const std::string& bytes, const std::string& outFile) 33454aa6d63Sopenharmony_ci{ 33554aa6d63Sopenharmony_ci std::ofstream ops(outFile, std::ios::binary); 33654aa6d63Sopenharmony_ci bool flag = (WriteByteToOutFile(bytes, ops) == false); 33754aa6d63Sopenharmony_ci if (flag) { 33854aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to write data to ops, outfile: %s", outFile.c_str()); 33954aa6d63Sopenharmony_ci return false; 34054aa6d63Sopenharmony_ci } 34154aa6d63Sopenharmony_ci return true; 34254aa6d63Sopenharmony_ci} 34354aa6d63Sopenharmony_ci 34454aa6d63Sopenharmony_cibool FileUtils::WriteByteToOutFile(const std::string& bytes, std::ofstream& outFile) 34554aa6d63Sopenharmony_ci{ 34654aa6d63Sopenharmony_ci if (outFile.rdstate() != 0) { 34754aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to get output stream object, outfile"); 34854aa6d63Sopenharmony_ci return false; 34954aa6d63Sopenharmony_ci } 35054aa6d63Sopenharmony_ci outFile.write(&bytes[0], bytes.size()); 35154aa6d63Sopenharmony_ci if (outFile.rdstate() != 0) { 35254aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to write data to ops, outfile "); 35354aa6d63Sopenharmony_ci return false; 35454aa6d63Sopenharmony_ci } 35554aa6d63Sopenharmony_ci outFile.flush(); 35654aa6d63Sopenharmony_ci if (outFile.rdstate() != 0) { 35754aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Flush error"); 35854aa6d63Sopenharmony_ci return false; 35954aa6d63Sopenharmony_ci } 36054aa6d63Sopenharmony_ci return true; 36154aa6d63Sopenharmony_ci} 36254aa6d63Sopenharmony_ci 36354aa6d63Sopenharmony_cibool FileUtils::WriteByteToOutFile(const std::vector<int8_t>& bytes, std::ofstream& outFile) 36454aa6d63Sopenharmony_ci{ 36554aa6d63Sopenharmony_ci if (outFile.rdstate() != 0) { 36654aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to get output stream object, outfile"); 36754aa6d63Sopenharmony_ci return false; 36854aa6d63Sopenharmony_ci } 36954aa6d63Sopenharmony_ci outFile.write((char*)&bytes[0], bytes.size()); 37054aa6d63Sopenharmony_ci if (outFile.rdstate() != 0) { 37154aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Failed to write data to ops, outfile "); 37254aa6d63Sopenharmony_ci return false; 37354aa6d63Sopenharmony_ci } 37454aa6d63Sopenharmony_ci outFile.flush(); 37554aa6d63Sopenharmony_ci if (outFile.rdstate() != 0) { 37654aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Flush error"); 37754aa6d63Sopenharmony_ci return false; 37854aa6d63Sopenharmony_ci } 37954aa6d63Sopenharmony_ci return true; 38054aa6d63Sopenharmony_ci} 38154aa6d63Sopenharmony_ci 38254aa6d63Sopenharmony_cibool FileUtils::IsRunnableFile(const std::string& name) 38354aa6d63Sopenharmony_ci{ 38454aa6d63Sopenharmony_ci if (name.empty()) { 38554aa6d63Sopenharmony_ci return false; 38654aa6d63Sopenharmony_ci } 38754aa6d63Sopenharmony_ci size_t dotPos = name.rfind('.'); 38854aa6d63Sopenharmony_ci if (dotPos == std::string::npos) { 38954aa6d63Sopenharmony_ci return false; 39054aa6d63Sopenharmony_ci } 39154aa6d63Sopenharmony_ci std::string suffix = name.substr(dotPos + 1); 39254aa6d63Sopenharmony_ci if (suffix == "an" || suffix == "abc") { 39354aa6d63Sopenharmony_ci return true; 39454aa6d63Sopenharmony_ci } 39554aa6d63Sopenharmony_ci std::string libDir = name.substr(0, LIBS_PATH_PREFIX.size()); 39654aa6d63Sopenharmony_ci if (LIBS_PATH_PREFIX.compare(libDir) == 0) { 39754aa6d63Sopenharmony_ci return true; 39854aa6d63Sopenharmony_ci } 39954aa6d63Sopenharmony_ci return false; 40054aa6d63Sopenharmony_ci} 40154aa6d63Sopenharmony_ci 40254aa6d63Sopenharmony_cibool FileUtils::IsValidFile(std::string file) 40354aa6d63Sopenharmony_ci{ 40454aa6d63Sopenharmony_ci std::filesystem::path filePath = file; 40554aa6d63Sopenharmony_ci bool flag = std::filesystem::exists(filePath); 40654aa6d63Sopenharmony_ci if (!flag) { 40754aa6d63Sopenharmony_ci PrintErrorNumberMsg("FILE_NOT_FOUND", FILE_NOT_FOUND, "'" + file + "' file is not exists"); 40854aa6d63Sopenharmony_ci return false; 40954aa6d63Sopenharmony_ci } 41054aa6d63Sopenharmony_ci flag = std::filesystem::is_directory(filePath); 41154aa6d63Sopenharmony_ci if (flag) { 41254aa6d63Sopenharmony_ci PrintErrorNumberMsg("FILE_NOT_FOUND", FILE_NOT_FOUND, "'" + file + "' file is a directory not file"); 41354aa6d63Sopenharmony_ci return false; 41454aa6d63Sopenharmony_ci } 41554aa6d63Sopenharmony_ci return true; 41654aa6d63Sopenharmony_ci} 41754aa6d63Sopenharmony_ci 41854aa6d63Sopenharmony_ciint64_t FileUtils::GetFileLen(const std::string& file) 41954aa6d63Sopenharmony_ci{ 42054aa6d63Sopenharmony_ci std::filesystem::path filePath = file; 42154aa6d63Sopenharmony_ci bool flag = std::filesystem::exists(filePath) && std::filesystem::is_regular_file(filePath); 42254aa6d63Sopenharmony_ci if (flag) { 42354aa6d63Sopenharmony_ci return std::filesystem::file_size(filePath); 42454aa6d63Sopenharmony_ci } 42554aa6d63Sopenharmony_ci return -1; 42654aa6d63Sopenharmony_ci} 42754aa6d63Sopenharmony_ci 42854aa6d63Sopenharmony_civoid FileUtils::DelDir(const std::string& file) 42954aa6d63Sopenharmony_ci{ 43054aa6d63Sopenharmony_ci std::filesystem::path filePath = file; 43154aa6d63Sopenharmony_ci bool flag = std::filesystem::is_directory(filePath); 43254aa6d63Sopenharmony_ci if (flag) { 43354aa6d63Sopenharmony_ci for (auto& p : std::filesystem::recursive_directory_iterator(filePath)) { 43454aa6d63Sopenharmony_ci DelDir(p.path()); 43554aa6d63Sopenharmony_ci } 43654aa6d63Sopenharmony_ci } 43754aa6d63Sopenharmony_ci std::filesystem::remove(file); 43854aa6d63Sopenharmony_ci return; 43954aa6d63Sopenharmony_ci} 44054aa6d63Sopenharmony_ci 44154aa6d63Sopenharmony_ci} // namespace SignatureTools 44254aa6d63Sopenharmony_ci} // namespace OHOS