1 /*
2 * Copyright (c) 2022-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #define HST_LOG_TAG "FileSystem"
16
17 #include "osal/filesystem/file_system.h"
18 #ifdef _WIN32
19 #include <direct.h>
20 #include <fcntl.h>
21 #include <windows.h>
22 #else
23 #include <unistd.h>
24 #endif
25
26 #include <cerrno>
27 #include <cstdio>
28 #include <cstdlib>
29 #include <cstring>
30 #include <dirent.h>
31 #include "common/log.h"
32
33 namespace {
34 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_FOUNDATION, "FileSystem" };
35 }
36
37 #ifndef _WIN32
38 mode_t umask(mode_t mask);
39 #endif
40
41 namespace OHOS {
42 namespace Media {
IsRegularFile(const std::string & path)43 bool FileSystem::IsRegularFile(const std::string& path)
44 {
45 struct stat s {};
46 return (stat(path.c_str(), &s) == 0) && S_ISREG(s.st_mode);
47 }
48
IsFdValid(int32_t fd,struct stat & s)49 bool FileSystem::IsFdValid(int32_t fd, struct stat& s)
50 {
51 return fstat(fd, &s) == 0;
52 }
53
IsRegularFile(int32_t fd)54 bool FileSystem::IsRegularFile(int32_t fd)
55 {
56 struct stat s {};
57 return IsFdValid(fd, s) && S_ISREG(s.st_mode);
58 }
59
IsSocketFile(int32_t fd)60 bool FileSystem::IsSocketFile(int32_t fd)
61 {
62 struct stat s {};
63 return IsFdValid(fd, s) && S_ISSOCK(s.st_mode);
64 }
65
IsSeekable(int32_t fd)66 bool FileSystem::IsSeekable(int32_t fd)
67 {
68 return IsRegularFile(fd) && lseek(fd, 0, SEEK_CUR) != -1;
69 }
70
IsDirectory(const std::string & path)71 bool FileSystem::IsDirectory(const std::string& path)
72 {
73 struct stat s {};
74 return (stat(path.c_str(), &s) == 0) && S_ISDIR(s.st_mode);
75 }
76
77 // judge regular file, directory, symbolic link file path exists
IsExists(const std::string & path)78 bool FileSystem::IsExists(const std::string& path)
79 {
80 return access(path.c_str(), 0) != -1;
81 }
82
MakeDir(const std::string & path)83 bool FileSystem::MakeDir(const std::string& path)
84 {
85 #ifdef _WIN32
86 if (mkdir(path.c_str()) == -1) {
87 MEDIA_LOG_E("Fail to create dir " PUBLIC_LOG_S " due to " PUBLIC_LOG_S, path.c_str(), std::strerror(errno));
88 return false;
89 }
90 #else
91 #ifndef OHOS_LITE
92 auto oldMask = umask(0);
93 #endif
94 if (mkdir(path.c_str(), 755) == -1) { // 755 directory access permissions
95 MEDIA_LOG_E("Fail to create dir " PUBLIC_LOG_S " due to " PUBLIC_LOG_S, path.c_str(), std::strerror(errno));
96 #ifndef OHOS_LITE
97 umask(oldMask);
98 #endif
99 return false;
100 }
101 #ifndef OHOS_LITE
102 umask(oldMask);
103 #endif
104 #endif
105 return true;
106 }
107
MakeMultipleDir(const std::string & path)108 bool FileSystem::MakeMultipleDir(const std::string& path)
109 {
110 FALSE_RETURN_V(!IsExists(path), true);
111
112 // pos is 1, not 0 example: D:/a/b, /local/tmp/
113 // Avoid Linux root path before is empty string, which makes it impossible to judge whether the path exists
114 auto index = path.find('/', 1);
115 while (index != std::string::npos) {
116 std::string tPath = path.substr(0, index);
117 FALSE_RETURN_V(IsExists(tPath) || MakeDir(tPath), false);
118 index = path.find('/', index + 1);
119 }
120 return path[path.size() - 1] == '/' || MakeDir(path);
121 }
122
ClearFileContent(const std::string & fullPath)123 void FileSystem::ClearFileContent(const std::string& fullPath)
124 {
125 MEDIA_LOG_I("Clear file content path : " PUBLIC_LOG_S, fullPath.c_str());
126 auto filePtr = fopen(fullPath.c_str(), "w+");
127 if (!filePtr) {
128 MEDIA_LOG_E("Clear file content fail.");
129 return;
130 }
131 fclose(filePtr);
132 }
133
RemoveFilesInDir(const std::string & path)134 void FileSystem::RemoveFilesInDir(const std::string& path)
135 {
136 DIR *directory;
137 if ((directory = opendir(path.c_str())) != nullptr) {
138 struct dirent *info;
139 while ((info = readdir(directory)) != nullptr) {
140 if (strcmp(info->d_name, ".") == 0 || strcmp(info->d_name, "..") == 0) {
141 continue;
142 }
143 std::string fullPath = path + "/" + info->d_name;
144 MEDIA_LOG_D("Remove file : " PUBLIC_LOG_S, fullPath.c_str());
145 NZERO_LOG(remove(fullPath.c_str()));
146 }
147 closedir(directory);
148 }
149 }
150 } // namespace Media
151 } // namespace OHOS