|  | // Copyright 2013 The Flutter Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef FLUTTER_FML_FILE_H_ | 
|  | #define FLUTTER_FML_FILE_H_ | 
|  |  | 
|  | #include <functional> | 
|  | #include <initializer_list> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "flutter/fml/macros.h" | 
|  | #include "flutter/fml/unique_fd.h" | 
|  |  | 
|  | #ifdef ERROR | 
|  | #undef ERROR | 
|  | #endif | 
|  |  | 
|  | namespace fml { | 
|  |  | 
|  | class Mapping; | 
|  |  | 
|  | enum class FilePermission { | 
|  | kRead, | 
|  | kWrite, | 
|  | kReadWrite, | 
|  | }; | 
|  |  | 
|  | std::string CreateTemporaryDirectory(); | 
|  |  | 
|  | /// This can open a directory on POSIX, but not on Windows. | 
|  | fml::UniqueFD OpenFile(const char* path, | 
|  | bool create_if_necessary, | 
|  | FilePermission permission); | 
|  |  | 
|  | /// This can open a directory on POSIX, but not on Windows. | 
|  | fml::UniqueFD OpenFile(const fml::UniqueFD& base_directory, | 
|  | const char* path, | 
|  | bool create_if_necessary, | 
|  | FilePermission permission); | 
|  |  | 
|  | /// Helper method that calls `OpenFile` with create_if_necessary = false | 
|  | /// and permission = kRead. | 
|  | /// | 
|  | /// This can open a directory on POSIX, but not on Windows. | 
|  | fml::UniqueFD OpenFileReadOnly(const fml::UniqueFD& base_directory, | 
|  | const char* path); | 
|  |  | 
|  | fml::UniqueFD OpenDirectory(const char* path, | 
|  | bool create_if_necessary, | 
|  | FilePermission permission); | 
|  |  | 
|  | fml::UniqueFD OpenDirectory(const fml::UniqueFD& base_directory, | 
|  | const char* path, | 
|  | bool create_if_necessary, | 
|  | FilePermission permission); | 
|  |  | 
|  | /// Helper method that calls `OpenDirectory` with create_if_necessary = false | 
|  | /// and permission = kRead. | 
|  | fml::UniqueFD OpenDirectoryReadOnly(const fml::UniqueFD& base_directory, | 
|  | const char* path); | 
|  |  | 
|  | fml::UniqueFD Duplicate(fml::UniqueFD::element_type descriptor); | 
|  |  | 
|  | bool IsDirectory(const fml::UniqueFD& directory); | 
|  |  | 
|  | bool IsDirectory(const fml::UniqueFD& base_directory, const char* path); | 
|  |  | 
|  | // Returns whether the given path is a file. | 
|  | bool IsFile(const std::string& path); | 
|  |  | 
|  | bool TruncateFile(const fml::UniqueFD& file, size_t size); | 
|  |  | 
|  | bool FileExists(const fml::UniqueFD& base_directory, const char* path); | 
|  |  | 
|  | bool UnlinkDirectory(const char* path); | 
|  |  | 
|  | bool UnlinkDirectory(const fml::UniqueFD& base_directory, const char* path); | 
|  |  | 
|  | bool UnlinkFile(const char* path); | 
|  |  | 
|  | bool UnlinkFile(const fml::UniqueFD& base_directory, const char* path); | 
|  |  | 
|  | fml::UniqueFD CreateDirectory(const fml::UniqueFD& base_directory, | 
|  | const std::vector<std::string>& components, | 
|  | FilePermission permission); | 
|  |  | 
|  | bool WriteAtomically(const fml::UniqueFD& base_directory, | 
|  | const char* file_name, | 
|  | const Mapping& mapping); | 
|  |  | 
|  | /// Signature of a callback on a file in `directory` with `filename` (relative | 
|  | /// to `directory`). The returned bool should be false if and only if further | 
|  | /// traversal should be stopped. For example, a file-search visitor may return | 
|  | /// false when the file is found so no more visiting is needed. | 
|  | using FileVisitor = std::function<bool(const fml::UniqueFD& directory, | 
|  | const std::string& filename)>; | 
|  |  | 
|  | /// Call `visitor` on all files inside the `directory` non-recursively. The | 
|  | /// trivial file "." and ".." will not be visited. | 
|  | /// | 
|  | /// Return false if and only if the visitor returns false during the | 
|  | /// traversal. | 
|  | /// | 
|  | /// If recursive visiting is needed, call `VisitFiles` inside the `visitor`, or | 
|  | /// use our helper method `VisitFilesRecursively`. | 
|  | /// | 
|  | /// @see `VisitFilesRecursively`. | 
|  | /// @note Procedure doesn't copy all closures. | 
|  | bool VisitFiles(const fml::UniqueFD& directory, const FileVisitor& visitor); | 
|  |  | 
|  | /// Recursively call `visitor` on all files inside the `directory`. Return false | 
|  | /// if and only if the visitor returns false during the traversal. | 
|  | /// | 
|  | /// This is a helper method that wraps the general `VisitFiles` method. The | 
|  | /// `VisitFiles` is strictly more powerful as it has the access of the recursion | 
|  | /// stack to the file. For example, `VisitFiles` may be able to maintain a | 
|  | /// vector of directory names that lead to a file. That could be useful to | 
|  | /// compute the relative path between the root directory and the visited file. | 
|  | /// | 
|  | /// @see `VisitFiles`. | 
|  | /// @note Procedure doesn't copy all closures. | 
|  | bool VisitFilesRecursively(const fml::UniqueFD& directory, | 
|  | const FileVisitor& visitor); | 
|  |  | 
|  | /// Helper method to recursively remove files and subdirectories inside the | 
|  | /// directory. The directory itself will not be removed. | 
|  | /// | 
|  | /// Return true if and only if all files have been successfully removed. | 
|  | bool RemoveFilesInDirectory(const fml::UniqueFD& directory); | 
|  |  | 
|  | /// Helper method to recursively remove files and subdirectories inside the | 
|  | /// directory. The directory itself will also be removed. | 
|  | /// | 
|  | /// Return true if and only if all files have been successfully removed. | 
|  | bool RemoveDirectoryRecursively(const fml::UniqueFD& parent, | 
|  | const char* directory_name); | 
|  |  | 
|  | class ScopedTemporaryDirectory { | 
|  | public: | 
|  | ScopedTemporaryDirectory(); | 
|  |  | 
|  | ~ScopedTemporaryDirectory(); | 
|  |  | 
|  | const std::string& path() const { return path_; } | 
|  | const UniqueFD& fd() { return dir_fd_; } | 
|  |  | 
|  | private: | 
|  | std::string path_; | 
|  | UniqueFD dir_fd_; | 
|  | }; | 
|  |  | 
|  | }  // namespace fml | 
|  |  | 
|  | #endif  // FLUTTER_FML_FILE_H_ |