diff -up ark-15.12.0/app/batchextract.cpp.improve_subfolder_autodetection ark-15.12.0/app/batchextract.cpp --- ark-15.12.0/app/batchextract.cpp.improve_subfolder_autodetection 2015-12-09 06:01:32.000000000 -0600 +++ ark-15.12.0/app/batchextract.cpp 2015-12-15 07:01:03.558096124 -0600 @@ -67,9 +67,9 @@ void BatchExtract::addExtraction(Kerfuff { QString destination = destinationFolder(); - if ((autoSubfolder()) && (!archive->isSingleFolderArchive())) { + if ((autoSubfolder()) && (!archive->isSingleFolderArchive() || !archive->fileBaseName().startsWith(archive->subfolderName()))) { const QDir d(destination); - QString subfolderName = archive->subfolderName(); + QString subfolderName = archive->fileBaseName(); if (d.exists(subfolderName)) { subfolderName = KIO::suggestName(QUrl::fromUserInput(destination, QString(), QUrl::AssumeLocalFile), subfolderName); diff -up ark-15.12.0/kerfuffle/archive_kerfuffle.cpp.improve_subfolder_autodetection ark-15.12.0/kerfuffle/archive_kerfuffle.cpp --- ark-15.12.0/kerfuffle/archive_kerfuffle.cpp.improve_subfolder_autodetection 2015-12-09 06:01:32.000000000 -0600 +++ ark-15.12.0/kerfuffle/archive_kerfuffle.cpp 2015-12-15 07:01:03.558096124 -0600 @@ -292,6 +292,16 @@ QString Archive::fileName() const return m_iface->filename(); } +QString Archive::fileBaseName() const +{ + QString base = QFileInfo(m_iface->filename()).completeBaseName(); + //special case for tar.gz/bzip2 files + if (base.right(4).toUpper() == QLatin1String(".TAR")) { + base.chop(4); + } + return base; +} + void Archive::onAddFinished(KJob* job) { //if the archive was previously a single folder archive and an add job @@ -313,15 +323,7 @@ void Archive::onListFinished(KJob* job) m_isPasswordProtected = ljob->isPasswordProtected(); m_subfolderName = ljob->subfolderName(); if (m_subfolderName.isEmpty()) { - QFileInfo fi(fileName()); - QString base = fi.completeBaseName(); - - //special case for tar.gz/bzip2 files - if (base.right(4).toUpper() == QLatin1String(".TAR")) { - base.chop(4); - } - - m_subfolderName = base; + m_subfolderName = fileBaseName(); } m_hasBeenListed = true; diff -up ark-15.12.0/kerfuffle/archive_kerfuffle.h.improve_subfolder_autodetection ark-15.12.0/kerfuffle/archive_kerfuffle.h --- ark-15.12.0/kerfuffle/archive_kerfuffle.h.improve_subfolder_autodetection 2015-12-15 07:01:03.558096124 -0600 +++ ark-15.12.0/kerfuffle/archive_kerfuffle.h 2015-12-15 07:02:45.776682176 -0600 @@ -149,6 +149,7 @@ public: ArchiveError error() const; bool isValid() const; QString fileName() const; + QString fileBaseName() const; bool isReadOnly() const; KJob* open(); diff -up ark-15.12.0/kerfuffle/jobs.cpp.improve_subfolder_autodetection ark-15.12.0/kerfuffle/jobs.cpp --- ark-15.12.0/kerfuffle/jobs.cpp.improve_subfolder_autodetection 2015-12-09 06:01:32.000000000 -0600 +++ ark-15.12.0/kerfuffle/jobs.cpp 2015-12-15 07:01:03.559096130 -0600 @@ -226,7 +226,8 @@ void ListJob::onNewEntry(const ArchiveEn m_isPasswordProtected |= entry [ IsPasswordProtected ].toBool(); if (m_isSingleFolderArchive) { - const QString fileName(entry[FileName].toString()); + const QString fileName(entry[FileName].toString() + .replace(QRegExp(QString::fromLatin1("^\\./")), QString())); const QString basePath(fileName.split(QLatin1Char( '/' )).at(0)); if (m_basePath.isEmpty()) {