public final File copy(final Directory destDirectory, final String newFileName) throws FileNotOnDiskException, DiskReadException {
		checkExists();

		String destFileName = "";

		if (destDirectory != null) destFileName += destDirectory.toString();
		else destFileName += this.getParent();

		if (newFileName != null) destFileName += separatorChar + newFileName.toString();
		else destFileName += separatorChar + this.getName();

		try {
			final File destFile = new File(destFileName);
			//FileUtils.copyFile(this, destFile);

			///////
			if (this.getCanonicalPath().equals(destFile.getCanonicalPath())) return this;
			if (destFile.canWrite() == false) destFile.clean();

			FileInputStream fis = null;
			FileOutputStream fos = null;
			FileChannel input = null;
			FileChannel output = null;
			try {
				fis = new FileInputStream(this);
				fos = new FileOutputStream(destFile);
				input = fis.getChannel();
				output = fos.getChannel();
				long size = input.size();
				long pos = 0;
				long count = 0;
				while (pos < size) {
					count = size - pos > FILE_COPY_BUFFER_SIZE ? FILE_COPY_BUFFER_SIZE : size - pos;
					pos += output.transferFrom(input, pos, count);
				}
			} finally {
				this.closeStream(output);
				this.closeStream(fos);
				this.closeStream(input);
				this.closeStream(fis);
			}

			if (this.length() != destFile.length())
				throw new DiskReadException("Failed to copy full contents [" + this.toString() + "]=>[" + destFile.toString() + "'");

			destFile.setLastModified(this.lastModified());

			////////

			return destFile;
		} catch (final IOException e) {
			throw new DiskReadException("File Copy [" + this.toString() + "]=>[" + destFileName.toString() + "]", e);
		}
	}