14
14
import java .io .IOException ;
15
15
import java .io .InputStreamReader ;
16
16
import java .io .OutputStreamWriter ;
17
+ import java .nio .channels .FileChannel ;
17
18
import java .util .HashMap ;
18
19
import java .util .Map ;
19
20
@@ -39,25 +40,26 @@ public void init() {
39
40
Functions .set ("fclose" , new fclose ());
40
41
41
42
// Operations
42
- Functions .set ("delete" , new delete ());
43
+ Functions .set ("copy" , new copy ());
44
+ Functions .set ("delete" , fileToBoolean (File ::delete ));
43
45
Functions .set ("listFiles" , new listFiles ());
44
- Functions .set ("mkdir" , new mkdir ( ));
45
- Functions .set ("mkdirs" , new mkdirs ( ));
46
+ Functions .set ("mkdir" , fileToBoolean ( File :: mkdir ));
47
+ Functions .set ("mkdirs" , fileToBoolean ( File :: mkdirs ));
46
48
Functions .set ("rename" , new rename ());
47
49
48
50
// Permissions and statuses
49
- Functions .set ("canExecute" , new canExecute ( ));
50
- Functions .set ("canRead" , new canRead ( ));
51
- Functions .set ("canWrite" , new canWrite ( ));
52
- Functions .set ("isDirectory" , new isDirectory ( ));
53
- Functions .set ("isFile" , new isFile ( ));
54
- Functions .set ("isHidden" , new isHidden ( ));
51
+ Functions .set ("canExecute" , fileToBoolean ( File :: canExecute ));
52
+ Functions .set ("canRead" , fileToBoolean ( File :: canRead ));
53
+ Functions .set ("canWrite" , fileToBoolean ( File :: canWrite ));
54
+ Functions .set ("isDirectory" , fileToBoolean ( File :: isDirectory ));
55
+ Functions .set ("isFile" , fileToBoolean ( File :: isFile ));
56
+ Functions .set ("isHidden" , fileToBoolean ( File :: isHidden ));
55
57
Functions .set ("setExecutable" , new setExecutable ());
56
58
Functions .set ("setReadable" , new setReadable ());
57
59
Functions .set ("setReadOnly" , new setReadOnly ());
58
60
Functions .set ("setWritable" , new setWritable ());
59
61
60
- Functions .set ("exists" , new exists ( ));
62
+ Functions .set ("exists" , fileToBoolean ( File :: exists ));
61
63
Functions .set ("fileSize" , new fileSize ());
62
64
Functions .set ("getParent" , new getParent ());
63
65
Functions .set ("lastModified" , new lastModified ());
@@ -176,81 +178,31 @@ protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
176
178
}
177
179
}
178
180
179
- private static class canExecute extends FileFunction {
180
- @ Override
181
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
182
- return NumberValue .fromBoolean (fileInfo .file .canExecute ());
183
- }
184
- }
185
-
186
- private static class canRead extends FileFunction {
187
- @ Override
188
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
189
- return NumberValue .fromBoolean (fileInfo .file .canRead ());
190
- }
191
- }
192
-
193
- private static class canWrite extends FileFunction {
194
- @ Override
195
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
196
- return NumberValue .fromBoolean (fileInfo .file .canWrite ());
197
- }
198
- }
199
-
200
- private static class delete extends FileFunction {
201
- @ Override
202
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
203
- return NumberValue .fromBoolean (fileInfo .file .delete ());
204
- }
205
- }
206
-
207
- private static class exists extends FileFunction {
208
- @ Override
209
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
210
- return NumberValue .fromBoolean (fileInfo .file .exists ());
211
- }
212
- }
181
+ private static class copy implements Function {
213
182
214
- private static class isDirectory extends FileFunction {
215
183
@ Override
216
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
217
- return NumberValue .fromBoolean (fileInfo .file .isDirectory ());
218
- }
219
- }
220
-
221
- private static class isFile extends FileFunction {
222
- @ Override
223
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
224
- return NumberValue .fromBoolean (fileInfo .file .isFile ());
225
- }
226
- }
227
-
228
- private static class isHidden extends FileFunction {
229
- @ Override
230
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
231
- return NumberValue .fromBoolean (fileInfo .file .isHidden ());
184
+ public Value execute (Value ... args ) {
185
+ Arguments .check (2 , args .length );
186
+ try {
187
+ final FileInputStream is = new FileInputStream (fileFrom (args [0 ]));
188
+ final FileOutputStream os = new FileOutputStream (fileFrom (args [1 ]));
189
+ final FileChannel ic = is .getChannel ();
190
+ ic .transferTo (0 , ic .size (), os .getChannel ());
191
+ is .close ();
192
+ os .close ();
193
+ return NumberValue .ONE ;
194
+ } catch (IOException ioe ) {
195
+ return NumberValue .MINUS_ONE ;
196
+ }
232
197
}
233
198
}
234
199
235
- private static class mkdir extends FileFunction {
236
- @ Override
237
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
238
- return NumberValue .fromBoolean (fileInfo .file .mkdir ());
239
- }
240
- }
200
+ private static class rename implements Function {
241
201
242
- private static class mkdirs extends FileFunction {
243
202
@ Override
244
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
245
- return NumberValue .fromBoolean (fileInfo .file .mkdirs ());
246
- }
247
- }
248
-
249
- private static class rename extends FileFunction {
250
- @ Override
251
- protected Value execute (FileInfo fileInfo , Value [] args ) throws IOException {
252
- final File dest = files .get (args [1 ].asInt ()).file ;
253
- return NumberValue .fromBoolean (fileInfo .file .renameTo (dest ));
203
+ public Value execute (Value ... args ) {
204
+ Arguments .check (2 , args .length );
205
+ return NumberValue .fromBoolean ( fileFrom (args [0 ]).renameTo (fileFrom (args [1 ])) );
254
206
}
255
207
}
256
208
@@ -598,6 +550,25 @@ protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
598
550
return NumberValue .ONE ;
599
551
}
600
552
}
553
+
554
+ private static File fileFrom (Value value ) {
555
+ if (value .type () == Types .NUMBER ) {
556
+ return files .get (value .asInt ()).file ;
557
+ }
558
+ return new File (value .asString ());
559
+ }
560
+
561
+ private interface FileToBooleanFunction {
562
+
563
+ boolean apply (File file );
564
+ }
565
+
566
+ private static Function fileToBoolean (FileToBooleanFunction f ) {
567
+ return args -> {
568
+ Arguments .check (1 , args .length );
569
+ return NumberValue .fromBoolean (f .apply (fileFrom (args [0 ])));
570
+ };
571
+ }
601
572
602
573
private static class FileInfo {
603
574
File file ;
0 commit comments