| // 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_ |