aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/include/vcpkg_Files.h
blob: 3f9570946242c65cca5e84b2b804f874810f243e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#pragma once

#include "expected.h"
#include "filesystem_fs.h"
#include <iterator>

namespace vcpkg::Files
{
    static const char* FILESYSTEM_INVALID_CHARACTERS = R"(\/:*?"<>|)";

    void check_is_directory(const fs::path& dirpath);

    bool has_invalid_chars_for_filesystem(const std::string& s);

    expected<std::string> read_contents(const fs::path& file_path) noexcept;

    expected<std::vector<std::string>> read_all_lines(const fs::path& file_path);

    void write_all_lines(const fs::path& file_path, const std::vector<std::string>& lines);

    fs::path find_file_recursively_up(const fs::path& starting_dir, const std::string& filename);

    template <class Pred>
    void non_recursive_find_matching_paths_in_dir(const fs::path& dir, const Pred predicate, std::vector<fs::path>* output)
    {
        std::copy_if(fs::directory_iterator(dir), fs::directory_iterator(), std::back_inserter(*output), predicate);
    }

    template <class Pred>
    void recursive_find_matching_paths_in_dir(const fs::path& dir, const Pred predicate, std::vector<fs::path>* output)
    {
        std::copy_if(fs::recursive_directory_iterator(dir), fs::recursive_directory_iterator(), std::back_inserter(*output), predicate);
    }

    template <class Pred>
    std::vector<fs::path> recursive_find_matching_paths_in_dir(const fs::path& dir, const Pred predicate)
    {
        std::vector<fs::path> v;
        recursive_find_matching_paths_in_dir(dir, predicate, &v);
        return v;
    }

    void recursive_find_files_with_extension_in_dir(const fs::path& dir, const std::string& extension, std::vector<fs::path>* output);

    std::vector<fs::path> recursive_find_files_with_extension_in_dir(const fs::path& dir, const std::string& extension);

    void recursive_find_all_files_in_dir(const fs::path& dir, std::vector<fs::path>* output);

    std::vector<fs::path> recursive_find_all_files_in_dir(const fs::path& dir);

    void non_recursive_find_all_files_in_dir(const fs::path& dir, std::vector<fs::path>* output);

    std::vector<fs::path> non_recursive_find_all_files_in_dir(const fs::path& dir);

    void print_paths(const std::vector<fs::path>& paths);
}