@@ -14,26 +14,30 @@ public class ZipDeflater {
14
14
15
15
private final ZipFile zipFile ;
16
16
private final File destFolder ;
17
+ private final Random random ;
18
+ private final File file ;
17
19
18
20
public ZipDeflater (File file , File destFolder ) throws ZipException , IOException {
21
+ this .file = file ;
19
22
this .destFolder = destFolder ;
20
23
this .zipFile = new ZipFile (file );
24
+ this .random = new Random ();
21
25
}
22
26
23
27
public void deflate () throws IOException {
24
- String folderName = tempFolderNameFromZip ( );
28
+ String tmpFolderName = folderNameFromZip () + random . nextInt ( 1000000 );
25
29
26
- File folder = new File (destFolder , folderName );
30
+ File tmpFolder = new File (destFolder , tmpFolderName );
27
31
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 );
30
34
}
31
35
32
36
Enumeration <? extends ZipEntry > entries = zipFile .entries ();
33
37
while (entries .hasMoreElements ()) {
34
38
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 ());
37
41
if (entry .isDirectory ()) {
38
42
entryFile .mkdir ();
39
43
} else {
@@ -58,8 +62,33 @@ public void deflate() throws IOException {
58
62
}
59
63
}
60
64
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 ();
63
92
}
64
93
65
94
private void ensureFoldersOfEntryExist (File folder , ZipEntry entry ) {
@@ -73,25 +102,22 @@ private void ensureFoldersOfEntryExist(File folder, ZipEntry entry) {
73
102
74
103
private void ensureOneLevelFolder (File folder ) {
75
104
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 ;
83
109
}
110
+
111
+ files [0 ].renameTo (new File (folder .getParentFile (), files [0 ].getName ()));
112
+ recursiveDelete (folder );
84
113
}
85
114
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 ("." ));
93
119
}
94
- return folderName ;
120
+ return filename ;
95
121
}
96
122
97
123
}
0 commit comments