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> 8 #include <armnnUtils/Filesystem.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 */ NamedTempFile(const char * fileName)25fs::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 */ CreateDirectory(std::string path)47std::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()); 69 throw armnn::RuntimeException(error); 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 */ RemoveDirectoryAndContents(const std::string & path)84void 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()); 97 throw armnn::RuntimeException(error); 98 } 99 } 100 } 101 ReadFileContentsIntoString(const std::string & path)102FileContents 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) 116