From 3ab49ee04087536835c9cdc0b00e4a7d26c7395c Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 22 Feb 2022 14:46:39 +0100 Subject: [PATCH] MimeDatabase::mimeTypeForFileNameAndData: Do not open file unnecessarily If the file extension already matches uniquely, we do not need to do any actual file operation. Pick-to: 6.3 Change-Id: Ide8b82eefbcd13348b78b28b66230a91e1e3c5d8 Reviewed-by: David Faure Reviewed-by: Thiago Macieira --- src/corelib/mimetypes/qmimedatabase.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp index 67d062bb9e..2bf64c9422 100644 --- a/src/corelib/mimetypes/qmimedatabase.cpp +++ b/src/corelib/mimetypes/qmimedatabase.cpp @@ -399,11 +399,15 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa // Extension is unknown, or matches multiple mimetypes. // Pass 2) Match on content, if we can read the data const auto matchOnContent = [this, &candidatesByName](QIODevice *device) { + const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly); if (device->isOpen()) { // Read 16K in one go (QIODEVICE_BUFFERSIZE in qiodevice_p.h). // This is much faster than seeking back and forth into QIODevice. const QByteArray data = device->peek(16384); + if (openedByUs) + device->close(); + int magicAccuracy = 0; QMimeType candidateByData(findByData(data, &magicAccuracy)); @@ -441,7 +445,6 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa return matchOnContent(device); QFile fallbackFile(fileName); - fallbackFile.open(QIODevice::ReadOnly); // error handling: matchOnContent() will check isOpen() return matchOnContent(&fallbackFile); } @@ -780,10 +783,7 @@ QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, QIO if (fileName.endsWith(QLatin1Char('/'))) return d->mimeTypeForName(directoryMimeType()); - const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly); const QMimeType result = d->mimeTypeForFileNameAndData(fileName, device); - if (openedByUs) - device->close(); return result; }