diff --git a/pcsx2-qt/Settings/MemoryCardConvertDialog.cpp b/pcsx2-qt/Settings/MemoryCardConvertDialog.cpp index a0ce0e41a8..615dbc2fe0 100644 --- a/pcsx2-qt/Settings/MemoryCardConvertDialog.cpp +++ b/pcsx2-qt/Settings/MemoryCardConvertDialog.cpp @@ -11,7 +11,13 @@ #include "common/Path.h" #include "common/StringUtil.h" -#include +// Platform-specific includes +#ifdef _WIN32 + #include +#else + #include + #include +#endif MemoryCardConvertDialog::MemoryCardConvertDialog(QWidget* parent, QString selectedCard) : QDialog(parent) @@ -38,7 +44,7 @@ MemoryCardConvertDialog::MemoryCardConvertDialog(QWidget* parent, QString select m_ui.progressBar->setRange(0, 100); m_ui.progressBar->setValue(0); - connect(m_ui.conversionTypeSelect, &QComboBox::currentIndexChanged, this, [this]() + connect(m_ui.conversionTypeSelect, &QComboBox::currentIndexChanged, this, [this]() { switch (m_srcCardInfo.type) { @@ -73,7 +79,7 @@ MemoryCardConvertDialog::MemoryCardConvertDialog(QWidget* parent, QString select } } ); - + disconnect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, nullptr); connect(m_ui.buttonBox->button(QDialogButtonBox::Ok), &QPushButton::clicked, this, &MemoryCardConvertDialog::ConvertCard); @@ -156,7 +162,7 @@ bool MemoryCardConvertDialog::SetupPicklist() for (auto dirEntry : rootDir) { const std::string_view fileName = Path::GetFileName(dirEntry.FileName); - + if (fileName.size() >= 7 && fileName.substr(0, 7).compare("_pcsx2_") == 0) { continue; @@ -178,7 +184,7 @@ bool MemoryCardConvertDialog::SetupPicklist() if (sizeBytes < CardCapacity::_8_MB) { m_ui.conversionTypeSelect->addItem(tr("8 MB File"), 8); - + if (!typeSet) { SetType_8(); @@ -189,7 +195,7 @@ bool MemoryCardConvertDialog::SetupPicklist() if (sizeBytes < CardCapacity::_16_MB) { m_ui.conversionTypeSelect->addItem(tr("16 MB File"), 16); - + if (!typeSet) { SetType_16(); @@ -200,7 +206,7 @@ bool MemoryCardConvertDialog::SetupPicklist() if (sizeBytes < CardCapacity::_32_MB) { m_ui.conversionTypeSelect->addItem(tr("32 MB File"), 32); - + if (!typeSet) { SetType_32(); @@ -211,7 +217,7 @@ bool MemoryCardConvertDialog::SetupPicklist() if (sizeBytes < CardCapacity::_64_MB) { m_ui.conversionTypeSelect->addItem(tr("64 MB File"), 64); - + if (!typeSet) { SetType_64(); @@ -244,7 +250,7 @@ void MemoryCardConvertDialog::ConvertCard() else { QString baseName = m_selectedCard; - + // Get our destination file name size_t extensionPos = baseName.lastIndexOf(".ps2", -1); // Strip the extension off of it @@ -260,14 +266,34 @@ void MemoryCardConvertDialog::ConvertCard() QDir destinationDir(fullPath); QString absolutePath = destinationDir.absolutePath(); // Get the absolute path - if (access(absolutePath.toStdString().c_str(), R_OK | W_OK | X_OK) != 0) - { - QMessageBox::critical(this, tr("Cannot Convert Memory Card"), - tr("You have insufficient permissions to convert this Memory Card. Please ensure that your user owns the directory of your Memory Cards. \n \"%1\".") - .arg(absolutePath)); - return; - } - + // Check for read/write/execute permissions on the directory + // We only need to check the parent directory where the file will be created + QFileInfo dirInfo(destinationDir.absolutePath()); + QString dirPath = dirInfo.absolutePath(); + + #ifdef _WIN32 + // Windows systems + DWORD fileAttributes = GetFileAttributes(dirPath.toStdString().c_str()); + + // Windows has no direct R/W/X permission model like Linux. We check for basic file existence. + bool canRead = !(fileAttributes & FILE_ATTRIBUTE_READONLY); + bool canWrite = true; // If not read-only, assume write is possible (for this basic example) + + if !(canRead && canWrite) + { + PermissionError(absolutePath); + return; + } + + #else + // Linux/Unix code using access() for checking R/W/X permissions + if (access(dirPath.toStdString().c_str(), R_OK | W_OK | X_OK) != 0) + { + PermissionError(absolutePath); + return; + } + #endif + // If a match is found, revert back to the base name, add a number and the extension, and try again. // Keep incrementing the number until we get a unique result. while (m_srcCardInfo.type == MemoryCardType::File ? FileSystem::DirectoryExists(Path::Combine(EmuFolders::MemoryCards, destName.toStdString()).c_str()) : FileSystem::FileExists(Path::Combine(EmuFolders::MemoryCards, destName.toStdString()).c_str())) @@ -275,7 +301,7 @@ void MemoryCardConvertDialog::ConvertCard() destName = baseName; destName.append(StringUtil::StdStringFromFormat("_%02zd.ps2", ++num).c_str()); } - + m_destCardName = destName; StartThread(); } @@ -317,3 +343,8 @@ void MemoryCardConvertDialog::SetType_Folder() { SetType(MemoryCardType::Folder, MemoryCardFileType::Unknown, tr("Uses a folder on your PC filesystem, instead of a file. Infinite capacity, while keeping the same compatibility as an 8 MB Memory Card.")); } + +void MemoryCardConvertDialog::PermissionError(QString absolutePath) +{ + QMessageBox::critical(this, tr("Cannot Convert Memory Card"),tr("You have insufficient permissions to convert this Memory Card. Please ensure that your user owns the directory of your Memory Cards. \n \"%1\".").arg(absolutePath)); +} \ No newline at end of file diff --git a/pcsx2-qt/Settings/MemoryCardConvertDialog.h b/pcsx2-qt/Settings/MemoryCardConvertDialog.h index 5e876b6fde..6817448ab7 100644 --- a/pcsx2-qt/Settings/MemoryCardConvertDialog.h +++ b/pcsx2-qt/Settings/MemoryCardConvertDialog.h @@ -41,6 +41,7 @@ private: void SetType_32(); void SetType_64(); void SetType_Folder(); + void PermissionError(QString absolutePath); Ui::MemoryCardConvertDialog m_ui;