mirror of
https://git.mirrors.martin98.com/https://github.com/gulrak/filesystem
synced 2025-06-04 11:13:58 +08:00
Replace std::shared_ptr<void> to unique_handle
This commit is contained in:
parent
7b8cf519f2
commit
1dbe2d9bec
@ -2007,6 +2007,52 @@ GHC_INLINE file_status file_status_from_st_mode(T mode)
|
||||
}
|
||||
|
||||
#ifdef GHC_OS_WINDOWS
|
||||
|
||||
class unique_handle
|
||||
{
|
||||
public:
|
||||
typedef HANDLE element_type;
|
||||
|
||||
unique_handle() noexcept
|
||||
: handle_(INVALID_HANDLE_VALUE)
|
||||
{
|
||||
}
|
||||
explicit unique_handle(element_type h) noexcept
|
||||
: handle_(h)
|
||||
{
|
||||
}
|
||||
unique_handle(unique_handle&& u) noexcept
|
||||
: handle_(u.release())
|
||||
{
|
||||
}
|
||||
~unique_handle() { reset(); }
|
||||
unique_handle& operator=(unique_handle&& u) noexcept
|
||||
{
|
||||
reset(u.release());
|
||||
return *this;
|
||||
}
|
||||
element_type get() const noexcept { return handle_; }
|
||||
explicit operator bool() const noexcept { return handle_ != INVALID_HANDLE_VALUE; }
|
||||
element_type release() noexcept
|
||||
{
|
||||
element_type tmp = handle_;
|
||||
handle_ = INVALID_HANDLE_VALUE;
|
||||
return tmp;
|
||||
}
|
||||
void reset(element_type h = INVALID_HANDLE_VALUE) noexcept
|
||||
{
|
||||
element_type tmp = handle_;
|
||||
handle_ = h;
|
||||
if (tmp != INVALID_HANDLE_VALUE) {
|
||||
CloseHandle(tmp);
|
||||
}
|
||||
}
|
||||
void swap(unique_handle& u) noexcept { std::swap(handle_, u.handle_); }
|
||||
|
||||
private:
|
||||
element_type handle_;
|
||||
};
|
||||
|
||||
#ifndef REPARSE_DATA_BUFFER_HEADER_SIZE
|
||||
typedef struct _REPARSE_DATA_BUFFER
|
||||
{
|
||||
@ -2051,8 +2097,8 @@ struct free_deleter
|
||||
|
||||
GHC_INLINE std::unique_ptr<REPARSE_DATA_BUFFER, free_deleter<REPARSE_DATA_BUFFER>> getReparseData(const path& p, std::error_code& ec)
|
||||
{
|
||||
std::shared_ptr<void> file(CreateFileW(GHC_NATIVEWP(p), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, 0), CloseHandle);
|
||||
if (file.get() == INVALID_HANDLE_VALUE) {
|
||||
unique_handle file(CreateFileW(GHC_NATIVEWP(p), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, 0));
|
||||
if (!file) {
|
||||
ec = detail::make_system_error();
|
||||
return nullptr;
|
||||
}
|
||||
@ -4162,10 +4208,10 @@ GHC_INLINE bool equivalent(const path& p1, const path& p2, std::error_code& ec)
|
||||
{
|
||||
ec.clear();
|
||||
#ifdef GHC_OS_WINDOWS
|
||||
std::shared_ptr<void> file1(::CreateFileW(GHC_NATIVEWP(p1), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0), CloseHandle);
|
||||
detail::unique_handle file1(::CreateFileW(GHC_NATIVEWP(p1), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0));
|
||||
auto e1 = ::GetLastError();
|
||||
std::shared_ptr<void> file2(::CreateFileW(GHC_NATIVEWP(p2), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0), CloseHandle);
|
||||
if (file1.get() == INVALID_HANDLE_VALUE || file2.get() == INVALID_HANDLE_VALUE) {
|
||||
detail::unique_handle file2(::CreateFileW(GHC_NATIVEWP(p2), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0));
|
||||
if (!file1 || !file2) {
|
||||
#ifdef LWG_2937_BEHAVIOUR
|
||||
ec = detail::make_system_error(e1 ? e1 : ::GetLastError());
|
||||
#else
|
||||
@ -4255,9 +4301,9 @@ GHC_INLINE uintmax_t hard_link_count(const path& p, std::error_code& ec) noexcep
|
||||
ec.clear();
|
||||
#ifdef GHC_OS_WINDOWS
|
||||
uintmax_t result = static_cast<uintmax_t>(-1);
|
||||
std::shared_ptr<void> file(::CreateFileW(GHC_NATIVEWP(p), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0), CloseHandle);
|
||||
detail::unique_handle file(::CreateFileW(GHC_NATIVEWP(p), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0));
|
||||
BY_HANDLE_FILE_INFORMATION inf;
|
||||
if (file.get() == INVALID_HANDLE_VALUE) {
|
||||
if (!file) {
|
||||
ec = detail::make_system_error();
|
||||
}
|
||||
else {
|
||||
@ -4486,7 +4532,7 @@ GHC_INLINE void last_write_time(const path& p, file_time_type new_time, std::err
|
||||
ec.clear();
|
||||
auto d = new_time.time_since_epoch();
|
||||
#ifdef GHC_OS_WINDOWS
|
||||
std::shared_ptr<void> file(::CreateFileW(GHC_NATIVEWP(p), FILE_WRITE_ATTRIBUTES, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL), ::CloseHandle);
|
||||
detail::unique_handle file(::CreateFileW(GHC_NATIVEWP(p), FILE_WRITE_ATTRIBUTES, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL));
|
||||
FILETIME ft;
|
||||
auto tt = std::chrono::duration_cast<std::chrono::microseconds>(d).count() * 10 + 116444736000000000;
|
||||
ft.dwLowDateTime = static_cast<DWORD>(tt);
|
||||
@ -4840,8 +4886,8 @@ GHC_INLINE void resize_file(const path& p, uintmax_t size, std::error_code& ec)
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
std::shared_ptr<void> file(CreateFileW(GHC_NATIVEWP(p), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL), CloseHandle);
|
||||
if (file.get() == INVALID_HANDLE_VALUE) {
|
||||
detail::unique_handle file(CreateFileW(GHC_NATIVEWP(p), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL));
|
||||
if (!file) {
|
||||
ec = detail::make_system_error();
|
||||
}
|
||||
else if (SetFilePointerEx(file.get(), lisize, NULL, FILE_BEGIN) == 0 || SetEndOfFile(file.get()) == 0) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user