+static void DumpZipDirectory(wxFileSystem& fs,
+                             const wxString& dir,
+                             const wxString& indent)
+{
+    wxString prefix = wxString::Format(_T("%s#zip:%s"),
+                                         TESTFILE_ZIP, dir.c_str());
+    wxString wildcard = prefix + _T("/*");
+
+    wxString dirname = fs.FindFirst(wildcard, wxDIR);
+    while ( !dirname.empty() )
+    {
+        if ( !dirname.StartsWith(prefix + _T('/'), &dirname) )
+        {
+            wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
+
+            break;
+        }
+
+        wxPrintf(_T("%s%s\n"), indent.c_str(), dirname.c_str());
+
+        DumpZipDirectory(fs, dirname,
+                         indent + wxString(_T(' '), 4));
+
+        dirname = fs.FindNext();
+    }
+
+    wxString filename = fs.FindFirst(wildcard, wxFILE);
+    while ( !filename.empty() )
+    {
+        if ( !filename.StartsWith(prefix, &filename) )
+        {
+            wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
+
+            break;
+        }
+
+        wxPrintf(_T("%s%s\n"), indent.c_str(), filename.c_str());
+
+        filename = fs.FindNext();
+    }
+}
+
+static void TestZipFileSystem()
+{
+    puts("*** Testing ZIP file system ***\n");
+
+    wxFileSystem::AddHandler(new wxZipFSHandler);
+    wxFileSystem fs;
+    wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP);
+
+    DumpZipDirectory(fs, _T(""), wxString(_T(' '), 4));
+}
+