mirror of
https://github.com/microsoft/DirectXTex.git
synced 2025-07-12 21:20:13 +02:00
clean up image files on failed write
This commit is contained in:
parent
51bc3d5b16
commit
b0d443f526
@ -21,30 +21,6 @@ using namespace DirectX;
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
class auto_delete_file
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
auto_delete_file(HANDLE hFile) : m_handle(hFile) {}
|
|
||||||
|
|
||||||
auto_delete_file(const auto_delete_file&) = delete;
|
|
||||||
auto_delete_file& operator=(const auto_delete_file&) = delete;
|
|
||||||
|
|
||||||
~auto_delete_file()
|
|
||||||
{
|
|
||||||
if (m_handle)
|
|
||||||
{
|
|
||||||
FILE_DISPOSITION_INFO info = { 0 };
|
|
||||||
info.DeleteFile = TRUE;
|
|
||||||
(void)SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear() { m_handle = 0; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
HANDLE m_handle;
|
|
||||||
};
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------
|
||||||
// Legacy format mapping table (used for DDS files without 'DX10' extended header)
|
// Legacy format mapping table (used for DDS files without 'DX10' extended header)
|
||||||
//-------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------
|
||||||
|
@ -1310,6 +1310,8 @@ HRESULT DirectX::SaveToTGAFile(const Image& image, const wchar_t* szFile)
|
|||||||
return HRESULT_FROM_WIN32(GetLastError());
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto_delete_file delonfail(hFile.get());
|
||||||
|
|
||||||
// Determine size for TGA pixel data
|
// Determine size for TGA pixel data
|
||||||
size_t rowPitch, slicePitch;
|
size_t rowPitch, slicePitch;
|
||||||
if (convFlags & CONV_FLAGS_888)
|
if (convFlags & CONV_FLAGS_888)
|
||||||
@ -1392,5 +1394,7 @@ HRESULT DirectX::SaveToTGAFile(const Image& image, const wchar_t* szFile)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delonfail.clear();
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -30,3 +30,33 @@ struct handle_closer { void operator()(HANDLE h) { assert(h != INVALID_HANDLE_VA
|
|||||||
typedef public std::unique_ptr<void, handle_closer> ScopedHandle;
|
typedef public std::unique_ptr<void, handle_closer> ScopedHandle;
|
||||||
|
|
||||||
inline HANDLE safe_handle( HANDLE h ) { return (h == INVALID_HANDLE_VALUE) ? 0 : h; }
|
inline HANDLE safe_handle( HANDLE h ) { return (h == INVALID_HANDLE_VALUE) ? 0 : h; }
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
struct find_closer { void operator()(HANDLE h) { assert(h != INVALID_HANDLE_VALUE); if (h) FindClose(h); } };
|
||||||
|
|
||||||
|
typedef public std::unique_ptr<void, find_closer> ScopedFindHandle;
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
class auto_delete_file
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
auto_delete_file(HANDLE hFile) : m_handle(hFile) {}
|
||||||
|
|
||||||
|
auto_delete_file(const auto_delete_file&) = delete;
|
||||||
|
auto_delete_file& operator=(const auto_delete_file&) = delete;
|
||||||
|
|
||||||
|
~auto_delete_file()
|
||||||
|
{
|
||||||
|
if (m_handle)
|
||||||
|
{
|
||||||
|
FILE_DISPOSITION_INFO info = { 0 };
|
||||||
|
info.DeleteFile = TRUE;
|
||||||
|
(void)SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear() { m_handle = 0; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
HANDLE m_handle;
|
||||||
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user