diff --git a/python/core/qgsfileutils.sip b/python/core/qgsfileutils.sip index 54ae1eb8291..1c04fec9aa1 100644 --- a/python/core/qgsfileutils.sip +++ b/python/core/qgsfileutils.sip @@ -65,6 +65,14 @@ will be returned unchanged. .. seealso:: :py:func:`extensionsFromFilter()` .. seealso:: :py:func:`ensureFileNameHasExtension()` +%End + + static QString stringToSafeFilename( const QString &string ); +%Docstring +Converts a ``string`` to a safe filename, replacing characters which are not safe +for filenames with an '_' character. + +This method should be called with file names only, not complete paths. %End }; diff --git a/src/core/qgsfileutils.cpp b/src/core/qgsfileutils.cpp index d1dd350d40f..2dc2efeef9e 100644 --- a/src/core/qgsfileutils.cpp +++ b/src/core/qgsfileutils.cpp @@ -69,3 +69,11 @@ QString QgsFileUtils::addExtensionFromFilter( const QString &fileName, const QSt const QStringList extensions = extensionsFromFilter( filter ); return ensureFileNameHasExtension( fileName, extensions ); } + +QString QgsFileUtils::stringToSafeFilename( const QString &string ) +{ + QRegularExpression rx( "[^\\w\\-. ]" ); + QString s = string; + s.replace( rx, QStringLiteral( "_" ) ); + return s; +} diff --git a/src/core/qgsfileutils.h b/src/core/qgsfileutils.h index 1a3455cad4a..a028e79811b 100644 --- a/src/core/qgsfileutils.h +++ b/src/core/qgsfileutils.h @@ -70,6 +70,14 @@ class CORE_EXPORT QgsFileUtils * \see ensureFileNameHasExtension() */ static QString addExtensionFromFilter( const QString &fileName, const QString &filter ); + + /** + * Converts a \a string to a safe filename, replacing characters which are not safe + * for filenames with an '_' character. + * + * This method should be called with file names only, not complete paths. + */ + static QString stringToSafeFilename( const QString &string ); }; #endif // QGSFILEUTILS_H diff --git a/tests/src/python/test_qgsfileutils.py b/tests/src/python/test_qgsfileutils.py index b2d7fdb8499..501b33e5569 100644 --- a/tests/src/python/test_qgsfileutils.py +++ b/tests/src/python/test_qgsfileutils.py @@ -55,6 +55,9 @@ class TestQgsFileUtils(unittest.TestCase): self.assertEqual(QgsFileUtils.addExtensionFromFilter('test.tif', 'All Files (*.*)'), 'test.tif') self.assertEqual(QgsFileUtils.addExtensionFromFilter('test', 'All Files (*.*)'), 'test') + def testStringToSafeFilename(self): + self.assertEqual(QgsFileUtils.stringToSafeFilename('my FiLe v2.0_new.tif'), 'my FiLe v2.0_new.tif') + self.assertEqual(QgsFileUtils.stringToSafeFilename('rendered map_final? rev (12-03-1017)_real@#$&*#%&*$!!@$%^&(*(.tif'), 'rendered map_final_ rev _12-03-1017__real____________________.tif') if __name__ == '__main__': unittest.main()