diff --git a/3rdparty/interface/archiveinterface/cliinterface.cpp b/3rdparty/interface/archiveinterface/cliinterface.cpp index 833d0a87..bf8c0ca8 100644 --- a/3rdparty/interface/archiveinterface/cliinterface.cpp +++ b/3rdparty/interface/archiveinterface/cliinterface.cpp @@ -110,13 +110,13 @@ PluginFinishType CliInterface::extractFiles(const QList &files, const return PFT_Nomral; } - bool bDlnfs = m_common->isSubpathOfDlnfs(options.strTargetPath); - setProperty("dlnfs", bDlnfs); + bool bLnfs = m_common->isSubpathOfLnfs(options.strTargetPath); + setProperty("lnfs", bLnfs); ArchiveData arcData = DataManager::get_instance().archiveData(); m_files = files; m_extractOptions = options; - if (!bDlnfs) { + if (!bLnfs) { if (arcData.listRootEntry.isEmpty() && options.qSize < FILE_MAX_SIZE) { emit signalprogress(1); setProperty("list", "tmpList"); @@ -125,10 +125,10 @@ PluginFinishType CliInterface::extractFiles(const QList &files, const return PFT_Nomral; } } - return extractFiles(files, options, bDlnfs); + return extractFiles(files, options, bLnfs); } -PluginFinishType CliInterface::extractFiles(const QList &files, const ExtractionOptions &options, bool bDlnfs) +PluginFinishType CliInterface::extractFiles(const QList &files, const ExtractionOptions &options, bool bLnfs) { ArchiveData arcData = DataManager::get_instance().archiveData(); setProperty("list", ""); @@ -193,7 +193,7 @@ PluginFinishType CliInterface::extractFiles(const QList &files, const } } //长文件解压 - if (!bDlnfs) { + if (!bLnfs) { for (FileEntry entry : m_files) { if (NAME_MAX < entry.strFileName.toLocal8Bit().length() || NAME_MAX < entry.strFullPath.toLocal8Bit().length()) { bHandleLongName = true; @@ -242,7 +242,7 @@ PluginFinishType CliInterface::extractFiles(const QList &files, const } else { password = options.password; } - if (!bDlnfs) { + if (!bLnfs) { for (QMap::const_iterator iter = arcData.mapFileEntry.begin(); iter != arcData.mapFileEntry.end(); iter++) { if (NAME_MAX < iter.value().strFileName.toLocal8Bit().length()) { bHandleLongName = true; @@ -764,7 +764,7 @@ bool CliInterface::runProcess(const QString &programName, const QStringList &arg emit signalFinished(PFT_Error); } deleteProcess(); - extractFiles(m_files, m_extractOptions, property("dlnfs").toBool()); + extractFiles(m_files, m_extractOptions, property("lnfs").toBool()); } }); } diff --git a/3rdparty/interface/archiveinterface/cliinterface.h b/3rdparty/interface/archiveinterface/cliinterface.h index 1e53b963..ac9a4066 100644 --- a/3rdparty/interface/archiveinterface/cliinterface.h +++ b/3rdparty/interface/archiveinterface/cliinterface.h @@ -182,7 +182,7 @@ class CliInterface : public ReadWriteArchiveInterface /** * @brief extractFiles 业务解压 */ - PluginFinishType extractFiles(const QList &files, const ExtractionOptions &options, bool bDlnfs); + PluginFinishType extractFiles(const QList &files, const ExtractionOptions &options, bool bLnfs); private: /** diff --git a/3rdparty/interface/common.cpp b/3rdparty/interface/common.cpp index f8aefb78..b6c4fbce 100644 --- a/3rdparty/interface/common.cpp +++ b/3rdparty/interface/common.cpp @@ -439,9 +439,9 @@ QString Common::handleLongNameforPath(const QString &strFilePath, const QString return sDir; } -bool Common::isSubpathOfDlnfs(const QString &path) +bool Common::isSubpathOfLnfs(const QString &path) { - return findDlnfsPath(path, [](const QString &target, const QString &compare) { + return findLnfsPath(path, [](const QString &target, const QString &compare) { return target.startsWith(compare); }); } @@ -484,7 +484,7 @@ bool Common::isSupportSeek(QString sFileName) return false; } -bool Common::findDlnfsPath(const QString &target, Compare func) +bool Common::findLnfsPath(const QString &target, Compare func) { Q_ASSERT(func); libmnt_table *tab { mnt_new_table() }; @@ -506,13 +506,28 @@ bool Common::findDlnfsPath(const QString &target, Compare func) while (mnt_table_next_fs(tab, iter, &fs) == 0) { if (!fs) continue; - qInfo() << unifyPath(mnt_fs_get_target(fs)); - if (strcmp("dlnfs", mnt_fs_get_source(fs)) == 0) { - QString mpt = unifyPath(mnt_fs_get_target(fs)); - if (func(unifyPath(target), mpt)) + const char* fsType = mnt_fs_get_fstype(fs); + const char* mountPoint = mnt_fs_get_target(fs); + + if (!mountPoint) + continue; + + QString fsTypeStr = fsType ? QString(fsType) : ""; + QString mountPointStr = unifyPath(mountPoint); + + qInfo() << "Checking filesystem - Type:" << fsTypeStr + << "Mount:" << mountPointStr; + + // 检查是否是支持长文件名的文件系统类型 + bool isLongFileNameFS = (fsTypeStr == "fuse.dlnfs") || + (fsTypeStr == "ulnfs"); + + if (isLongFileNameFS) { + if (func(unifyPath(target), mountPointStr)) { if (tab) mnt_free_table(tab); if (iter) mnt_free_iter(iter); return true; + } } } diff --git a/3rdparty/interface/common.h b/3rdparty/interface/common.h index 57cf2969..017f769c 100644 --- a/3rdparty/interface/common.h +++ b/3rdparty/interface/common.h @@ -41,7 +41,7 @@ class Common: public QObject //长文件夹处理 QString handleLongNameforPath(const QString &strFilePath, const QString &entryName, QMap &mapLongDirName, QMap &mapRealDirValue); //当前文件系统是否支持长文件 - bool isSubpathOfDlnfs(const QString &path); + bool isSubpathOfLnfs(const QString &path); /** * @brief isSupportSeek 是否支持seek操作 * @param sFileName 文件名 @@ -49,7 +49,7 @@ class Common: public QObject bool isSupportSeek(QString sFileName); private: //通过mount对应方法判断文件系统是否支持长文件 - bool findDlnfsPath(const QString &target, Compare func); + bool findLnfsPath(const QString &target, Compare func); }; /** diff --git a/3rdparty/libarchive/libarchive/libarchiveplugin.cpp b/3rdparty/libarchive/libarchive/libarchiveplugin.cpp index 976c5603..55ee1255 100644 --- a/3rdparty/libarchive/libarchive/libarchiveplugin.cpp +++ b/3rdparty/libarchive/libarchive/libarchiveplugin.cpp @@ -168,7 +168,7 @@ PluginFinishType LibarchivePlugin::extractFiles(const QList &files, c struct archive_entry *entry = nullptr; QString extractDst; - bool bDlnfs = m_common->isSubpathOfDlnfs(options.strTargetPath); + bool bLnfs = m_common->isSubpathOfLnfs(options.strTargetPath); // Iterate through all entries in archive. int iIndex = 0; // 存储索引值 while (!QThread::currentThread()->isInterruptionRequested() && (archive_read_next_header(m_archiveReader.data(), &entry) == ARCHIVE_OK)) { @@ -265,7 +265,7 @@ PluginFinishType LibarchivePlugin::extractFiles(const QList &files, c bool bLongName = false; QString tempFilePathName; QString strOriginName = entryName; - if(!bDlnfs) { + if(!bLnfs) { QString sDir = m_common->handleLongNameforPath(strFilePath, entryName, m_mapLongDirName, m_mapRealDirValue); if(sDir.length() > 0) { strFilePath = sDir.endsWith(QDir::separator())?sDir.left(sDir.length() -1):sDir; diff --git a/3rdparty/libzipplugin/libzipplugin.cpp b/3rdparty/libzipplugin/libzipplugin.cpp index c399dbf0..eec1c3d8 100644 --- a/3rdparty/libzipplugin/libzipplugin.cpp +++ b/3rdparty/libzipplugin/libzipplugin.cpp @@ -164,7 +164,7 @@ PluginFinishType LibzipPlugin::extractFiles(const QList &files, const } else { m_dScaleSize = 100.0 / options.qSize; } - m_bDlnfs = m_common->isSubpathOfDlnfs(options.strTargetPath); + m_bLnfs = m_common->isSubpathOfLnfs(options.strTargetPath); // 执行解压操作 bool bHandleLongName = false; @@ -821,7 +821,7 @@ ErrorType LibzipPlugin::extractEntry(zip_t *archive, zip_int64_t index, const Ex } QString tempFilePathName; - if(!m_bDlnfs) { + if(!m_bLnfs) { QString sDir = m_common->handleLongNameforPath(strFilePath, strFileName, m_mapLongDirName, m_mapRealDirValue); if(sDir.length() > 0) { strFilePath = sDir.endsWith(QDir::separator())?sDir.left(sDir.length() -1):sDir; diff --git a/3rdparty/libzipplugin/libzipplugin.h b/3rdparty/libzipplugin/libzipplugin.h index e190fb55..12e02e02 100644 --- a/3rdparty/libzipplugin/libzipplugin.h +++ b/3rdparty/libzipplugin/libzipplugin.h @@ -197,7 +197,7 @@ class LibzipPlugin : public ReadWriteArchiveInterface QMap m_mapLongDirName; // 长文件夹统计 QMap m_mapRealDirValue; // 长文件真实文件统计 QSet m_setLongName; // 存储被截取之后的文件名称(包含001之类的) - bool m_bDlnfs = false; //文件系统是否支持长文件 + bool m_bLnfs = false; //文件系统是否支持长文件 }; #endif // LIBZIPPLUGIN_H diff --git a/src/source/common/uitools.cpp b/src/source/common/uitools.cpp index 36c7ae45..2b080543 100644 --- a/src/source/common/uitools.cpp +++ b/src/source/common/uitools.cpp @@ -506,9 +506,19 @@ bool UiTools::isLocalDeviceFile(const QString &strFileName) qDebug() << "Checking if file is on local device:" << strFileName; QStorageInfo info(strFileName); QString sDevice = info.device(); - bool result = sDevice.startsWith("/dev/") || sDevice.startsWith("dlnfs"); //长文件名开启后以dlnfs方式挂载 - qDebug() << "Device:" << sDevice << "is local:" << result; - return result; + QString sFileSystemType = info.fileSystemType(); + + // 检查传统的本地设备(以 /dev/ 开头) + if (sDevice.startsWith("/dev/")) { + return true; + } + + // 检查长文件名文件系统类型 + if (sFileSystemType == "fuse.dlnfs" || sFileSystemType == "ulnfs") { + return true; + } + + return false; } QStringList UiTools::removeSameFileName(const QStringList &listFiles)