final void copyRek(final Path source, final Path destination)
			throws IOException {
		if (source.toFile().isDirectory()) {
			if (destination.toFile().exists()
					&& !destination.toFile().isDirectory()) {
				this.initState.setFailed();
				throw new IOException("Copying directory to file");
			}
			final String[] files = source.toFile().list();
			this.initState.incrementSize(files.length);
			for (final String s : files) {
				if (!destination.toFile().exists()) {
					if (!destination.toFile().mkdir()) {
						throw new IOException("Unable to create directory "
								+ destination);
					}
				}
				this.taskPool.addTask(new Runnable() {
					@Override
					public final void run() {
						if (AbcCreator.this.master.isInterrupted()
								|| AbcCreator.this.initState.failed()) {
							AbcCreator.this.bruteDir.delete();
							return;
						}
						try {
							copyRek(source.resolve(s), destination.resolve(s));
						} catch (final IOException e) {
							e.printStackTrace();
						}
						AbcCreator.this.initState.progress();
					}
				});
			}
			return;
		}
		final InputStream in = this.io.openIn(source.toFile());
		final OutputStream out = this.io.openOut(destination.toFile());
		this.io.write(in, out);
		this.io.close(out);
	}