ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
FileSystem.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <functional>
11 #include <string>
12 #include <vector>
13 
14 #include "CVCoreLib.h"
15 #include "Helper.h"
16 
17 namespace cloudViewer {
18 namespace utility {
19 namespace filesystem {
20 
21 // Join multiple paths into one path.
22 template <typename... T>
23 std::string JoinPaths(T const &...paths) {
24  std::string result;
25  if (sizeof...(paths) == 1) {
26  int unpack[]{0, (result = std::string(paths), 0)...};
27  static_cast<void>(unpack);
28  return result;
29  } else {
30  int unpack[]{
31  0, (result = result.empty() ? std::string(paths)
32  : result + "/" + std::string(paths),
33  0)...};
34  static_cast<void>(unpack);
35  }
36 
37  if (StringContains(result, "///")) {
38  result = StringReplace(result, "///", "/");
39  }
40  if (StringContains(result, "//")) {
41  result = StringReplace(result, "//", "/");
42  }
43  if (StringContains(result, "\\\\")) {
44  result = StringReplace(result, "\\\\", "/");
45  }
46  if (StringContains(result, "\\")) {
47  result = StringReplace(result, "\\", "/");
48  }
49 
50  if (StringEndsWith(result, "//")) {
51  result = StringReplaceLast(result, "//", "");
52  } else if (StringEndsWith(result, "/")) {
53  result = StringReplaceLast(result, "/", "");
54  }
55  return result;
56 }
57 
58 std::string CV_CORE_LIB_API
59 JoinPath(const std::vector<std::string> &path_components);
60 
61 std::string CV_CORE_LIB_API JoinPath(const std::string &path_component1,
62  const std::string &path_component2);
63 
64 std::string CV_CORE_LIB_API GetEnvVar(const std::string &env_var);
65 
82 std::string CV_CORE_LIB_API GetHomeDirectory();
83 
84 // Append trailing slash to string if it does not yet end with a slash.
85 std::string CV_CORE_LIB_API EnsureTrailingSlash(const std::string &str);
86 
87 // Check whether file name has the file extension (case insensitive).
88 bool CV_CORE_LIB_API HasFileExtension(const std::string &file_name,
89  const std::string &ext);
90 
91 // Split the path into its root and extension, for example,
92 // "dir/file.jpg" into "dir/file" and ".jpg".
93 void CV_CORE_LIB_API SplitFileExtension(const std::string &path,
94  std::string *root,
95  std::string *ext);
96 
103 bool CV_CORE_LIB_API CopyFile(const std::string &from, const std::string &to);
104 
111 bool CV_CORE_LIB_API CopyDir(const std::string &from, const std::string &to);
112 
113 bool CV_CORE_LIB_API CopyA(const std::string &src_path,
114  const std::string &dst_path);
115 
123 bool CV_CORE_LIB_API Copy(const std::string &from,
124  const std::string &to,
125  bool include_parent_dir = false,
126  const std::string &extname = "");
127 
128 std::string CV_CORE_LIB_API
129 GetFileExtensionInLowerCase(const std::string &filename);
130 
131 std::string CV_CORE_LIB_API
132 GetFileNameWithoutExtension(const std::string &filename);
133 
134 std::string CV_CORE_LIB_API
135 GetFileNameWithoutDirectory(const std::string &filename);
136 
137 std::string CV_CORE_LIB_API GetFileParentDirectory(const std::string &filename);
138 
139 std::string CV_CORE_LIB_API
140 GetRegularizedDirectoryName(const std::string &directory);
141 
142 std::string CV_CORE_LIB_API GetFileBaseName(const std::string &filename);
143 
145 
146 std::vector<std::string> CV_CORE_LIB_API
147 GetPathComponents(const std::string &path);
148 
150 
151 bool CV_CORE_LIB_API ChangeWorkingDirectory(const std::string &directory);
152 
153 bool CV_CORE_LIB_API IsFile(const std::string &filename);
154 
155 bool CV_CORE_LIB_API IsDirectory(const std::string &directory);
156 
157 bool CV_CORE_LIB_API DirectoryExists(const std::string &directory);
158 
159 // Return true if the directory is present and empty. Return false if the
160 // directory is present but not empty. Throw an exception if the directory is
161 // not present.
162 bool CV_CORE_LIB_API DirectoryIsEmpty(const std::string &directory);
163 
170 bool CV_CORE_LIB_API EnsureDirectory(const std::string &directory_path);
171 
172 bool CV_CORE_LIB_API MakeDirectory(const std::string &directory);
173 
174 bool CV_CORE_LIB_API MakeDirectoryHierarchy(const std::string &directory);
175 
176 bool CV_CORE_LIB_API DeleteDirectory(const std::string &directory);
177 
178 bool CV_CORE_LIB_API FileExists(const std::string &filename);
179 
180 bool CV_CORE_LIB_API RemoveFile(const std::string &filename);
181 
182 bool CV_CORE_LIB_API ListDirectory(const std::string &directory,
183  std::vector<std::string> &subdirs,
184  std::vector<std::string> &filenames);
185 
186 bool CV_CORE_LIB_API ListFilesInDirectory(const std::string &directory,
187  std::vector<std::string> &filenames);
188 
189 bool CV_CORE_LIB_API
190 ListFilesInDirectoryWithExtension(const std::string &directory,
191  const std::string &extname,
192  std::vector<std::string> &filenames);
193 
194 CV_CORE_LIB_API std::vector<std::string> FindFilesRecursively(
195  const std::string &directory,
196  std::function<bool(const std::string &)> is_match);
197 
198 // wrapper for fopen that enables unicode paths on Windows
199 CV_CORE_LIB_API FILE *FOpen(const std::string &filename,
200  const std::string &mode);
201 std::string CV_CORE_LIB_API GetIOErrorString(const int errnoVal);
202 bool CV_CORE_LIB_API FReadToBuffer(const std::string &path,
203  std::vector<char> &bytes,
204  std::string *errorStr);
205 
206 std::string CV_CORE_LIB_API AddIfExist(
207  const std::string &path, const std::vector<std::string> &folder_names);
208 
220 public:
222  ~CFile();
223 
225  bool Open(const std::string &filename, const std::string &mode);
226 
228  std::string GetError();
229 
231  void Close();
232 
234  int64_t CurPos();
235 
237  int64_t GetFileSize();
238 
240  int64_t GetNumLines();
241 
246  const char *ReadLine();
247 
252  template <class T>
253  size_t ReadData(T *data, size_t num_elems) {
254  return ReadData(data, sizeof(T), num_elems);
255  }
256 
261  size_t ReadData(void *data, size_t elem_size, size_t num_elems);
262 
264  FILE *GetFILE() { return file_; }
265 
266 private:
267  FILE *file_ = nullptr;
268  int error_code_ = 0;
269  std::vector<char> line_buffer_;
270 };
271 
272 } // namespace filesystem
273 } // namespace utility
274 } // namespace cloudViewer
#define CV_CORE_LIB_API
Definition: CVCoreLibWin.h:15
std::string filename
void * bytes
core::Tensor result
Definition: VtkUtils.cpp:76
FILE * GetFILE()
Returns the underlying C FILE pointer.
Definition: FileSystem.h:264
size_t ReadData(T *data, size_t num_elems)
Definition: FileSystem.h:253
Helper functions for the ml ops.
static const std::string path
Definition: PointCloud.cpp:59
bool ChangeWorkingDirectory(const std::string &directory)
Definition: FileSystem.cpp:427
bool ListFilesInDirectory(const std::string &directory, std::vector< std::string > &filenames)
Definition: FileSystem.cpp:561
bool RemoveFile(const std::string &filename)
Definition: FileSystem.cpp:528
std::vector< std::string > FindFilesRecursively(const std::string &directory, std::function< bool(const std::string &)> is_match)
Definition: FileSystem.cpp:586
bool IsDirectory(const std::string &directory)
Definition: FileSystem.cpp:454
std::string EnsureTrailingSlash(const std::string &str)
Definition: FileSystem.cpp:106
bool DeleteDirectory(const std::string &directory)
Definition: FileSystem.cpp:514
bool Copy(const std::string &from, const std::string &to, bool include_parent_dir=false, const std::string &extname="")
Copy a file or directory.
Definition: FileSystem.cpp:249
bool FReadToBuffer(const std::string &path, std::vector< char > &bytes, std::string *errorStr)
Definition: FileSystem.cpp:678
bool MakeDirectoryHierarchy(const std::string &directory)
Definition: FileSystem.cpp:499
bool CopyFile(const std::string &from, const std::string &to)
Copy a file.
Definition: FileSystem.cpp:163
bool DirectoryIsEmpty(const std::string &directory)
Definition: FileSystem.cpp:477
std::string GetFileParentDirectory(const std::string &filename)
Definition: FileSystem.cpp:314
std::string GetEnvVar(const std::string &env_var)
Definition: FileSystem.cpp:66
bool ListFilesInDirectoryWithExtension(const std::string &directory, const std::string &extname, std::vector< std::string > &filenames)
Definition: FileSystem.cpp:567
void SplitFileExtension(const std::string &path, std::string *root, std::string *ext)
Definition: FileSystem.cpp:137
bool DirectoryExists(const std::string &directory)
Definition: FileSystem.cpp:473
std::string JoinPath(const std::vector< std::string > &path_components)
Definition: FileSystem.cpp:58
std::string GetIOErrorString(const int errnoVal)
Definition: FileSystem.cpp:627
std::string GetFileBaseName(const std::string &filename)
Definition: FileSystem.cpp:310
bool CopyDir(const std::string &from, const std::string &to)
Copy a directory.
Definition: FileSystem.cpp:202
bool EnsureDirectory(const std::string &directory_path)
Check if a specified directory specified by directory_path exists. If not, recursively create the dir...
Definition: FileSystem.cpp:484
std::string GetRegularizedDirectoryName(const std::string &directory)
Definition: FileSystem.cpp:323
std::string GetFileNameWithoutExtension(const std::string &filename)
Definition: FileSystem.cpp:295
std::string GetFileExtensionInLowerCase(const std::string &filename)
Definition: FileSystem.cpp:281
bool FileExists(const std::string &filename)
Definition: FileSystem.cpp:524
bool IsFile(const std::string &filename)
Definition: FileSystem.cpp:435
std::string JoinPaths(T const &...paths)
Definition: FileSystem.h:23
std::vector< std::string > GetPathComponents(const std::string &path)
Definition: FileSystem.cpp:348
bool MakeDirectory(const std::string &directory)
Definition: FileSystem.cpp:491
FILE * FOpen(const std::string &filename, const std::string &mode)
Definition: FileSystem.cpp:609
std::string AddIfExist(const std::string &path, const std::vector< std::string > &folder_names)
Definition: FileSystem.cpp:726
bool HasFileExtension(const std::string &file_name, const std::string &ext)
Definition: FileSystem.cpp:117
std::string GetHomeDirectory()
Get the HOME directory for the user.
Definition: FileSystem.cpp:74
std::string GetFileNameWithoutDirectory(const std::string &filename)
Definition: FileSystem.cpp:301
bool CopyA(const std::string &src_path, const std::string &dst_path)
Definition: FileSystem.cpp:236
bool ListDirectory(const std::string &directory, std::vector< std::string > &subdirs, std::vector< std::string > &filenames)
Definition: FileSystem.cpp:532
bool StringEndsWith(const std::string &str, const std::string &postfix)
Definition: Helper.cpp:163
std::string StringReplaceLast(const std::string &str, const std::string &old_str, const std::string &new_str)
Definition: Helper.cpp:144
bool StringContains(const std::string &src, const std::string &dst)
Definition: Helper.cpp:154
std::string StringReplace(const std::string &str, const std::string &old_str, const std::string &new_str)
Definition: Helper.cpp:119
Generic file read and write utility for python interface.