winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

ManagedFile.cpp (1536B)


      1 // Copyright (c) Microsoft Corporation.
      2 // Licensed under the MIT License.
      3 #include "pch.h"
      4 #include "winget/ManagedFile.h"
      5 #include "AppInstallerLogging.h"
      6 
      7 namespace AppInstaller::Utility
      8 {
      9     ManagedFile ManagedFile::CreateWriteLockedFile(const std::filesystem::path& path, DWORD desiredAccess, bool deleteOnExit)
     10     {
     11         ManagedFile file;
     12         file.m_fileHandle.reset(CreateFileW(path.c_str(), desiredAccess, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr));
     13         THROW_LAST_ERROR_IF(!file.m_fileHandle);
     14         file.m_filePath = path;
     15         file.m_deleteFileOnExit = deleteOnExit;
     16 
     17         return file;
     18     }
     19 
     20     ManagedFile ManagedFile::OpenWriteLockedFile(const std::filesystem::path& path, DWORD desiredAccess)
     21     {
     22         ManagedFile file;
     23         file.m_fileHandle.reset(CreateFileW(path.c_str(), desiredAccess, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr));
     24         THROW_LAST_ERROR_IF(!file.m_fileHandle);
     25         file.m_filePath = path;
     26 
     27         return file;
     28     }
     29 
     30     ManagedFile::~ManagedFile()
     31     {
     32         if (m_deleteFileOnExit)
     33         {
     34             if (m_fileHandle)
     35             {
     36                 m_fileHandle.reset();
     37             }
     38 
     39             try
     40             {
     41                 std::filesystem::remove(m_filePath);
     42             }
     43             catch (...)
     44             {
     45                 AICLI_LOG(Core, Info, << "Failed to remove managed file at: " << m_filePath);
     46             }
     47         }
     48     }
     49 }