public synchronized void complete() throws IOException {
		this.channel.force(true);

		// Nothing more to do if we're already on the target file.
		if (this.current.equals(this.target)) {
			return;
		}

		FileUtils.deleteQuietly(this.target);
		FileUtils.copyFile(this.current, this.target);

		logger.debug("Re-opening torrent byte storage at " +
				this.target.getAbsolutePath() + ".");

		RandomAccessFile raf = new RandomAccessFile(this.target, "rw");
		raf.setLength(this.size);

		this.channel = raf.getChannel();
		this.raf.close();
		this.raf = raf;
		this.current = this.target;

		FileUtils.deleteQuietly(this.partial);
	}