// 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 #include #include #include #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& 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; /// 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_