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 Workerfs::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 Workerstd::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 Workervoid 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 WorkerFileContents 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