Updater/Win32: Use shell for deleting directories
This commit is contained in:
parent
512a8b2b39
commit
070b16e611
|
@ -12,6 +12,10 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <shellapi.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
Updater::Updater(ProgressCallback* progress) : m_progress(progress)
|
Updater::Updater(ProgressCallback* progress) : m_progress(progress)
|
||||||
{
|
{
|
||||||
progress->SetTitle("DuckStation Update Installer");
|
progress->SetTitle("DuckStation Update Installer");
|
||||||
|
@ -49,6 +53,24 @@ bool Updater::OpenUpdateZip(const char* path)
|
||||||
return ParseZip();
|
return ParseZip();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Updater::RecursiveDeleteDirectory(const char* path)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
// making this safer on Win32...
|
||||||
|
std::wstring wpath(StringUtil::UTF8StringToWideString(path));
|
||||||
|
wpath += L'\0';
|
||||||
|
|
||||||
|
SHFILEOPSTRUCTW op = {};
|
||||||
|
op.wFunc = FO_DELETE;
|
||||||
|
op.pFrom = wpath.c_str();
|
||||||
|
op.fFlags = FOF_NOCONFIRMATION;
|
||||||
|
|
||||||
|
return (SHFileOperationW(&op) == 0 && !op.fAnyOperationsAborted);
|
||||||
|
#else
|
||||||
|
return FileSystem::DeleteDirectory(path, true);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
bool Updater::ParseZip()
|
bool Updater::ParseZip()
|
||||||
{
|
{
|
||||||
if (unzGoToFirstFile(m_zf) != UNZ_OK)
|
if (unzGoToFirstFile(m_zf) != UNZ_OK)
|
||||||
|
@ -140,8 +162,7 @@ bool Updater::PrepareStagingDirectory()
|
||||||
if (FileSystem::DirectoryExists(m_staging_directory.c_str()))
|
if (FileSystem::DirectoryExists(m_staging_directory.c_str()))
|
||||||
{
|
{
|
||||||
m_progress->DisplayFormattedWarning("Update staging directory already exists, removing");
|
m_progress->DisplayFormattedWarning("Update staging directory already exists, removing");
|
||||||
FileSystem::DeleteDirectory(m_staging_directory.c_str(), true);
|
if (!RecursiveDeleteDirectory(m_staging_directory.c_str()) || FileSystem::DirectoryExists(m_staging_directory.c_str()))
|
||||||
if (FileSystem::DirectoryExists(m_staging_directory.c_str()))
|
|
||||||
{
|
{
|
||||||
m_progress->ModalError("Failed to remove old staging directory");
|
m_progress->ModalError("Failed to remove old staging directory");
|
||||||
return false;
|
return false;
|
||||||
|
@ -285,6 +306,6 @@ bool Updater::CommitUpdate()
|
||||||
void Updater::CleanupStagingDirectory()
|
void Updater::CleanupStagingDirectory()
|
||||||
{
|
{
|
||||||
// remove staging directory itself
|
// remove staging directory itself
|
||||||
if (!FileSystem::DeleteDirectory(m_staging_directory.c_str(), true))
|
if (!RecursiveDeleteDirectory(m_staging_directory.c_str()))
|
||||||
m_progress->DisplayFormattedError("Failed to remove staging directory '%s'", m_staging_directory.c_str());
|
m_progress->DisplayFormattedError("Failed to remove staging directory '%s'", m_staging_directory.c_str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@ public:
|
||||||
void CleanupStagingDirectory();
|
void CleanupStagingDirectory();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static bool RecursiveDeleteDirectory(const char* path);
|
||||||
|
|
||||||
struct FileToUpdate
|
struct FileToUpdate
|
||||||
{
|
{
|
||||||
std::string original_zip_filename;
|
std::string original_zip_filename;
|
||||||
|
|
Loading…
Reference in New Issue