TTW_Bot/filemanager.cpp

166 lines
4.6 KiB
C++

#include "filemanager.h"
#include <QDebug>
FileManager::FileManager()
{
m_systemPath = QCoreApplication::applicationDirPath();
m_userDataPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
}
FileManager& FileManager::instance()
{
static FileManager instance;
return instance;
}
QString FileManager::systemPath() const
{
return m_systemPath;
}
QString FileManager::userDataPath() const
{
return m_userDataPath;
}
QString FileManager::getPath(FileType type, const QString& subPath) const
{
QString basePath;
// Определяем базовый путь (системный или пользовательский)
switch (type) {
case Icons:
case SystemStyles:
basePath = m_systemPath;
break;
default:
basePath = m_userDataPath;
break;
}
// Добавляем подпапку
QString folder;
switch (type) {
case Sounds: folder = "sounds"; break;
case Images: folder = "images"; break;
case Styles: folder = "styles"; break;
case Voices: folder = "voices"; break;
case Fonts: folder = "fonts"; break;
case Temp: folder = "temp"; break;
case Backups: folder = "backups"; break;
case Exports: folder = "exports"; break;
case Logs: folder = "logs"; break;
case Cache: folder = "cache"; break;
case WebServerImages: folder = "webserver/images"; break;
case WebServerSounds: folder = "webserver/sounds"; break;
case Icons: folder = "ico"; break;
case SystemStyles: folder = "styles"; break;
default: folder = "";
}
QString path = QString("%1/%2").arg(basePath).arg(folder);
if (!subPath.isEmpty()) {
path += "/" + subPath;
}
return path;
}
QString FileManager::getFullPath(FileType type, const QString& fileName) const
{
QString path = getPath(type);
return QString("%1/%2").arg(path).arg(fileName);
}
bool FileManager::copyToUserData(const QString& sourceFile, FileType type,
CopyMode mode, QString* newFileName)
{
QFileInfo sourceInfo(sourceFile);
if (!sourceInfo.exists()) {
qWarning() << "FileManager: Source file doesn't exist:" << sourceFile;
return false;
}
QString destFolder = getPath(type);
QDir dir(destFolder);
if (!dir.exists()) {
if (!dir.mkpath(".")) {
qWarning() << "FileManager: Cannot create folder:" << destFolder;
return false;
}
}
QString destFileName = sourceInfo.fileName();
QString destPath = getFullPath(type, destFileName);
// Обрабатываем конфликты имен
if (QFile::exists(destPath)) {
switch (mode) {
case CopyIfNotExists:
// Файл уже существует, не копируем
if (newFileName) *newFileName = destFileName;
return true;
case CopyAlways:
// Перезаписываем существующий файл
QFile::remove(destPath);
break;
case CopyWithNewName:
// Генерируем уникальное имя
int counter = 1;
QString baseName = sourceInfo.baseName();
QString suffix = sourceInfo.suffix();
while (QFile::exists(destPath)) {
destFileName = QString("%1_%2.%3").arg(baseName).arg(counter).arg(suffix);
destPath = getFullPath(type, destFileName);
counter++;
}
break;
}
}
// Копируем файл
if (QFile::copy(sourceFile, destPath)) {
if (newFileName) *newFileName = destFileName;
return true;
}
qWarning() << "FileManager: Failed to copy file from" << sourceFile << "to" << destPath;
return false;
}
bool FileManager::existsInUserData(FileType type, const QString& fileName) const
{
QString path = getFullPath(type, fileName);
return QFile::exists(path);
}
void FileManager::initializeFolderStructure()
{
// Создаем все пользовательские папки
for (int i = Sounds; i <= WebServerSounds; ++i) {
FileType type = static_cast<FileType>(i);
QString path = getPath(type);
QDir dir(path);
if (!dir.exists()) {
dir.mkpath(".");
}
}
}
QString FileManager::getWebPath(FileType type, const QString& fileName) const
{
QString folder;
switch (type) {
case WebServerImages: folder = "imgs"; break;
case WebServerSounds: folder = "sounds"; break;
default: return QString();
}
return QString("/%1/%2").arg(folder).arg(fileName);
}