@@ -14,26 +14,30 @@ public class ZipDeflater {
1414
1515 private final ZipFile zipFile ;
1616 private final File destFolder ;
17+ private final Random random ;
18+ private final File file ;
1719
1820 public ZipDeflater (File file , File destFolder ) throws ZipException , IOException {
21+ this .file = file ;
1922 this .destFolder = destFolder ;
2023 this .zipFile = new ZipFile (file );
24+ this .random = new Random ();
2125 }
2226
2327 public void deflate () throws IOException {
24- String folderName = tempFolderNameFromZip ( );
28+ String tmpFolderName = folderNameFromZip () + random . nextInt ( 1000000 );
2529
26- File folder = new File (destFolder , folderName );
30+ File tmpFolder = new File (destFolder , tmpFolderName );
2731
28- if (!folder .mkdir ()) {
29- throw new IOException ("Unable to create folder " + folderName );
32+ if (!tmpFolder .mkdir ()) {
33+ throw new IOException ("Unable to create folder " + tmpFolderName );
3034 }
3135
3236 Enumeration <? extends ZipEntry > entries = zipFile .entries ();
3337 while (entries .hasMoreElements ()) {
3438 ZipEntry entry = entries .nextElement ();
35- ensureFoldersOfEntryExist (folder , entry );
36- File entryFile = new File (folder , entry .getName ());
39+ ensureFoldersOfEntryExist (tmpFolder , entry );
40+ File entryFile = new File (tmpFolder , entry .getName ());
3741 if (entry .isDirectory ()) {
3842 entryFile .mkdir ();
3943 } else {
@@ -58,8 +62,33 @@ public void deflate() throws IOException {
5862 }
5963 }
6064
61- // Test.zip may or may not contain Test folder. We use zip name to create libraries folder. Therefore, a contained Test folder is useless and must be removed
62- ensureOneLevelFolder (folder );
65+ deleteUndesiredFoldersAndFiles (tmpFolder );
66+
67+ // Test.zip may or may not contain Test folder. If it does, we keep it. If not, we use zip name.
68+ ensureOneLevelFolder (tmpFolder );
69+ }
70+
71+ private void deleteUndesiredFoldersAndFiles (File folder ) {
72+ for (File file : folder .listFiles ()) {
73+ if (file .isDirectory () && "__MACOSX" .equals (file .getName ())) {
74+ recursiveDelete (file );
75+ } else if (file .getName ().startsWith ("." )) {
76+ recursiveDelete (file );
77+ }
78+ }
79+ }
80+
81+ private void recursiveDelete (File file ) {
82+ if (file .isDirectory ()) {
83+ for (File current : file .listFiles ()) {
84+ if (current .isDirectory ()) {
85+ recursiveDelete (current );
86+ } else {
87+ current .delete ();
88+ }
89+ }
90+ }
91+ file .delete ();
6392 }
6493
6594 private void ensureFoldersOfEntryExist (File folder , ZipEntry entry ) {
@@ -73,25 +102,22 @@ private void ensureFoldersOfEntryExist(File folder, ZipEntry entry) {
73102
74103 private void ensureOneLevelFolder (File folder ) {
75104 File [] files = folder .listFiles ();
76- if (files .length == 1 && files [0 ].isDirectory ()) {
77- File tempFile = new File (files [0 ].getPath () + new Random ().nextInt (1000 ));
78- files [0 ].renameTo (tempFile );
79- for (File file : tempFile .listFiles ()) {
80- file .renameTo (new File (folder , file .getName ()));
81- }
82- tempFile .delete ();
105+
106+ if (files .length != 1 ) {
107+ folder .renameTo (new File (folder .getParentFile (), folderNameFromZip ()));
108+ return ;
83109 }
110+
111+ files [0 ].renameTo (new File (folder .getParentFile (), files [0 ].getName ()));
112+ recursiveDelete (folder );
84113 }
85114
86- private String tempFolderNameFromZip () {
87- String folderName = zipFile .getName ();
88- if (folderName .lastIndexOf ("." ) != -1 ) {
89- folderName = folderName .substring (0 , folderName .lastIndexOf ("." ));
90- }
91- if (folderName .lastIndexOf (File .separator ) != -1 ) {
92- folderName = folderName .substring (folderName .lastIndexOf (File .separator ) + 1 );
115+ private String folderNameFromZip () {
116+ String filename = file .getName ();
117+ if (filename .lastIndexOf ("." ) != -1 ) {
118+ filename = filename .substring (0 , filename .lastIndexOf ("." ));
93119 }
94- return folderName ;
120+ return filename ;
95121 }
96122
97123}
0 commit comments