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