11401458bSopenharmony_ci/* 21401458bSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 31401458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41401458bSopenharmony_ci * you may not use this file except in compliance with the License. 51401458bSopenharmony_ci * You may obtain a copy of the License at 61401458bSopenharmony_ci * 71401458bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81401458bSopenharmony_ci * 91401458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101401458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111401458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121401458bSopenharmony_ci * See the License for the specific language governing permissions and 131401458bSopenharmony_ci * limitations under the License. 141401458bSopenharmony_ci */ 151401458bSopenharmony_ci#include "file_util.h" 161401458bSopenharmony_ci 171401458bSopenharmony_ci#include <dirent.h> 181401458bSopenharmony_ci#include <fstream> 191401458bSopenharmony_ci#include <iostream> 201401458bSopenharmony_ci#include <sys/stat.h> 211401458bSopenharmony_ci#include <sys/types.h> 221401458bSopenharmony_ci#include <unistd.h> 231401458bSopenharmony_ci 241401458bSopenharmony_cinamespace OHOS { 251401458bSopenharmony_cinamespace HiviewDFX { 261401458bSopenharmony_cinamespace FileUtil { 271401458bSopenharmony_cinamespace { 281401458bSopenharmony_ciconst char PATH_DELIMITER = '/'; 291401458bSopenharmony_ci} 301401458bSopenharmony_cibool IsFileExists(const std::string& file) 311401458bSopenharmony_ci{ 321401458bSopenharmony_ci return access(file.c_str(), F_OK) == 0; 331401458bSopenharmony_ci} 341401458bSopenharmony_ci 351401458bSopenharmony_cibool IsFile(const std::string& file) 361401458bSopenharmony_ci{ 371401458bSopenharmony_ci struct stat statBuf {}; 381401458bSopenharmony_ci return lstat(file.c_str(), &statBuf) == 0 ? S_ISREG(statBuf.st_mode) : false; 391401458bSopenharmony_ci} 401401458bSopenharmony_ci 411401458bSopenharmony_cibool IsDirectory(const std::string& dir) 421401458bSopenharmony_ci{ 431401458bSopenharmony_ci struct stat statBuf {}; 441401458bSopenharmony_ci return lstat(dir.c_str(), &statBuf) == 0 ? S_ISDIR(statBuf.st_mode) : false; 451401458bSopenharmony_ci} 461401458bSopenharmony_ci 471401458bSopenharmony_cibool RemoveFile(const std::string& file) 481401458bSopenharmony_ci{ 491401458bSopenharmony_ci return !IsFileExists(file) || (remove(file.c_str()) == 0); 501401458bSopenharmony_ci} 511401458bSopenharmony_ci 521401458bSopenharmony_cibool RemoveDirectory(const std::string& dir) 531401458bSopenharmony_ci{ 541401458bSopenharmony_ci return !IsFileExists(dir) || (rmdir(dir.c_str()) == 0); 551401458bSopenharmony_ci} 561401458bSopenharmony_ci 571401458bSopenharmony_cibool ForceCreateDirectory(const std::string& dir) 581401458bSopenharmony_ci{ 591401458bSopenharmony_ci std::string::size_type index = 0; 601401458bSopenharmony_ci do { 611401458bSopenharmony_ci std::string subPath; 621401458bSopenharmony_ci index = dir.find('/', index + 1); // (index + 1) means the next char traversed 631401458bSopenharmony_ci if (index == std::string::npos) { 641401458bSopenharmony_ci subPath = dir; 651401458bSopenharmony_ci } else { 661401458bSopenharmony_ci subPath = dir.substr(0, index); 671401458bSopenharmony_ci } 681401458bSopenharmony_ci 691401458bSopenharmony_ci if (!IsFileExists(subPath) && mkdir(subPath.c_str(), S_IRWXU) != 0) { 701401458bSopenharmony_ci return false; 711401458bSopenharmony_ci } 721401458bSopenharmony_ci } while (index != std::string::npos); 731401458bSopenharmony_ci return IsFileExists(dir); 741401458bSopenharmony_ci} 751401458bSopenharmony_ci 761401458bSopenharmony_cistd::string GetFilePathByDir(const std::string& dir, const std::string& fileName) 771401458bSopenharmony_ci{ 781401458bSopenharmony_ci if (dir.empty()) { 791401458bSopenharmony_ci return fileName; 801401458bSopenharmony_ci } 811401458bSopenharmony_ci std::string filePath = dir; 821401458bSopenharmony_ci if (filePath.back() != '/') { 831401458bSopenharmony_ci filePath.push_back(PATH_DELIMITER); 841401458bSopenharmony_ci } 851401458bSopenharmony_ci filePath.append(fileName); 861401458bSopenharmony_ci return filePath; 871401458bSopenharmony_ci} 881401458bSopenharmony_ci 891401458bSopenharmony_cibool IsLegalPath(const std::string& path) 901401458bSopenharmony_ci{ 911401458bSopenharmony_ci if (path.find("./") != std::string::npos || 921401458bSopenharmony_ci path.find("../") != std::string::npos) { 931401458bSopenharmony_ci return false; 941401458bSopenharmony_ci } 951401458bSopenharmony_ci return true; 961401458bSopenharmony_ci} 971401458bSopenharmony_ci} // namespace FileUtil 981401458bSopenharmony_ci} // namespace HiviewDFX 991401458bSopenharmony_ci} // namespace OHOS 100