Skip to content

Commit 4caeb63

Browse files
committedMar 13, 2023
[api] Add useful ZIP files listing function to QgsZipUtils
1 parent 6234731 commit 4caeb63

File tree

4 files changed

+59
-0
lines changed

4 files changed

+59
-0
lines changed
 

‎python/core/auto_generated/qgsziputils.sip.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ also returned.
5656

5757

5858

59+
const QStringList files( const QString &zip );
60+
%Docstring
61+
Returns the list of files within a ``zip`` file
62+
63+
.. versionadded:: 3.30
64+
%End
65+
5966
};
6067

6168
/************************************************************************

‎src/core/qgsziputils.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,3 +293,35 @@ bool QgsZipUtils::encodeGzip( const QByteArray &bytesIn, QByteArray &bytesOut )
293293
deflateEnd( &strm );
294294
return true;
295295
}
296+
297+
const QStringList QgsZipUtils::files( const QString &zip )
298+
{
299+
if ( zip.isEmpty() && !QFileInfo::exists( zip ) )
300+
{
301+
return QStringList();
302+
}
303+
QStringList files;
304+
305+
int rc = 0;
306+
const QByteArray fileNamePtr = zip.toUtf8();
307+
struct zip *z = zip_open( fileNamePtr.constData(), 0, &rc );
308+
309+
if ( rc == ZIP_ER_OK && z )
310+
{
311+
const int count = zip_get_num_files( z );
312+
if ( count != -1 )
313+
{
314+
struct zip_stat stat;
315+
316+
for ( int i = 0; i < count; i++ )
317+
{
318+
zip_stat_index( z, i, 0, &stat );
319+
files << QString( stat.name );
320+
}
321+
}
322+
323+
zip_close( z );
324+
}
325+
326+
return files;
327+
}

‎src/core/qgsziputils.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ namespace QgsZipUtils
8484
*/
8585
CORE_EXPORT bool encodeGzip( const QByteArray &bytesIn, QByteArray &bytesOut ) SIP_SKIP;
8686

87+
/**
88+
* Returns the list of files within a \a zip file
89+
*
90+
* \since QGIS 3.30
91+
*/
92+
CORE_EXPORT const QStringList files( const QString &zip );
93+
8794
};
8895

8996
#endif //QGSZIPUTILS_H

‎tests/src/python/test_qgsziputils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,19 @@ def test_zip_unzip_ok(self):
121121
self.assertTrue(rc)
122122
self.assertEqual(len(files), 3)
123123

124+
def test_zip_files(self):
125+
zip = tmpPath()
126+
127+
f0 = os.path.join(unitTestDataPath(), 'multipoint.shp')
128+
f1 = os.path.join(unitTestDataPath(), 'lines.shp')
129+
f2 = os.path.join(unitTestDataPath(), 'joins.qgs')
130+
131+
rc = QgsZipUtils.zip(zip, [f0, f1, f2])
132+
self.assertTrue(rc)
133+
134+
files = QgsZipUtils.files(zip)
135+
self.assertEqual(files, ['multipoint.shp', 'lines.shp', 'joins.qgs'])
136+
124137

125138
if __name__ == '__main__':
126139
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.