ArmNN
 24.08
Filesystem.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2020,2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #if !defined(ARMNN_DISABLE_FILESYSTEM)
6 
7 #include <armnn/Exceptions.hpp>
9 
10 namespace armnnUtils
11 {
12 namespace Filesystem
13 {
14 
15 /**
16  * @brief Construct a temporary file name.
17  *
18  * Given a specified file name construct a path to that file in the
19  * system temporary directory. If the file already exists it is deleted. This
20  * could throw filesystem_error exceptions.
21  *
22  * @param fileName the file name required in the temporary directory.
23  * @return path consisting of system temporary directory and file name.
24  */
25 fs::path NamedTempFile(const char* fileName)
26 {
27  fs::path tmpDir = fs::temp_directory_path();
28  fs::path namedTempFile{tmpDir / fileName};
29  if (fs::exists(namedTempFile))
30  {
31  fs::remove(namedTempFile);
32  }
33  return namedTempFile;
34 }
35 
36 /**
37  * @brief Construct a temporary directory
38  *
39  * Given a specified directory name construct a path in the
40  * system temporary directory. If the directory already exists, it is deleted,
41  * otherwise create it. This could throw filesystem_error exceptions.
42  *
43  * @param path is the path required in the temporary directory.
44  * @return path consisting of system temporary directory.
45  * @throws RuntimeException if the directory cannot be created or exists but cannot be removed.
46  */
47 std::string CreateDirectory(std::string path)
48 {
49  // This line is very unlikely to throw an exception.
50  fs::path tmpDir = fs::temp_directory_path();
51  std::string full_path = tmpDir.generic_string() + path;
52  // This could throw a file permission exception.
53  RemoveDirectoryAndContents(full_path);
54 #if defined(_WIN32)
55  result = _mkdir(full_path.c_str()); // can be used on Windows
56  armnn::ConditionalThrow<armnn::RuntimeException>((result == 0), "Was unable to create temporary directory");
57 #else
58  try
59  {
60  if(!fs::create_directory(full_path))
61  {
62  throw armnn::RuntimeException("Unable to create directory: " + full_path);
63  }
64  }
65  catch (const std::system_error& e)
66  {
67  std::string error = "Unable to create directory. Reason: ";
68  error.append(e.what());
70  }
71 #endif
72 
73  return full_path + "/";
74 }
75 
76 /**
77  * @brief Remove a directory and its contents.
78  *
79  * Given a directory path delete it's contents and the directory. If the specified directory doesn't exist this
80  * does nothing. If any item cannot be removed this will throw a RuntimeException.
81  *
82  * @param full_path
83  */
84 void RemoveDirectoryAndContents(const std::string& path)
85 {
86  if (fs::exists(path))
87  {
88  try
89  {
90  // This could throw an exception on a multi-user system.
91  fs::remove_all(path);
92  }
93  catch (const std::system_error& e)
94  {
95  std::string error = "Directory exists and cannot be removed. Reason: ";
96  error.append(e.what());
98  }
99  }
100 }
101 
102 FileContents ReadFileContentsIntoString(const std::string& path) {
103  if (!fs::exists(path))
104  {
105  throw armnn::RuntimeException("Path does not exist: " + path);
106  }
107  std::ifstream input_file(path);
108  armnn::ConditionalThrow<armnn::RuntimeException>((input_file.is_open()), "Could not read file contents");
109  return FileContents((std::istreambuf_iterator<char>(input_file)), std::istreambuf_iterator<char>());
110 }
111 
112 } // namespace armnnUtils
113 } // namespace Filesystem
114 
115 #endif // !defined(ARMNN_DISABLE_FILESYSTEM)
armnn::BoostLogSeverityMapping::error
@ error
armnnUtils::Filesystem::FileContents
std::string FileContents
Definition: Filesystem.hpp:24
armnnUtils
Definition: CompatibleTypes.hpp:10
Filesystem.hpp
armnn::RuntimeException
Definition: Exceptions.hpp:120
armnnUtils::Filesystem::ReadFileContentsIntoString
FileContents ReadFileContentsIntoString(const std::string &path)
Definition: Filesystem.cpp:102
armnnUtils::Filesystem::RemoveDirectoryAndContents
void RemoveDirectoryAndContents(const std::string &path)
Remove a directory and its contents.
Definition: Filesystem.cpp:84
armnnUtils::Filesystem::NamedTempFile
fs::path NamedTempFile(const char *fileName)
Returns a path to a file in the system temporary folder. If the file existed it will be deleted.
Definition: Filesystem.cpp:25
Exceptions.hpp
armnnUtils::Filesystem::CreateDirectory
std::string CreateDirectory(std::string sPath)
Returns full path to temporary folder.
Definition: Filesystem.cpp:47