// Copyright (c) 2020 Egor Tensin // This file is part of the "winapi-common" project. // For details, see https://github.com/egor-tensin/winapi-common. // Distributed under the MIT License. #pragma once #include "handle.hpp" #include "path.hpp" #include #include #include #include #include #include namespace winapi { bool operator==(const FILE_ID_128& a, const FILE_ID_128& b); class File : private Handle { public: struct ID { const FILE_ID_INFO impl; bool operator==(const ID& other) const { return impl.VolumeSerialNumber == other.impl.VolumeSerialNumber && impl.FileId == other.impl.FileId; } }; static Handle open_r(const std::string&); static Handle open_r(const CanonicalPath&); static Handle open_read_attributes(const std::string&); static Handle open_read_attributes(const CanonicalPath&); static Handle open_w(const std::string&); static Handle open_w(const CanonicalPath&); static void remove(const std::string&); static void remove(const CanonicalPath&); explicit File(Handle&& handle) : Handle(std::move(handle)) {} using Handle::close; using Handle::read; using Handle::write; std::size_t get_size() const; ID query_id() const; }; } // namespace winapi namespace std { template <> struct hash { std::size_t operator()(const winapi::File::ID& id) const { std::size_t seed = 0; boost::hash_combine(seed, id.impl.VolumeSerialNumber); boost::hash_combine(seed, id.impl.FileId.Identifier); return seed; } }; } // namespace std