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