diff --git a/lib/copy.js b/lib/copy.js
index <HASH>..<HASH> 100644
--- a/lib/copy.js
+++ b/lib/copy.js
@@ -14,17 +14,31 @@ var isCallable = require('es5-ext/lib/Object/is-callable')
   , copy;
 
 copy = function (source, dest, options) {
-	var def = deferred(), stream, writeStream;
+	var def = deferred(), read, write;
+
 	try {
-		stream = createReadStream(source);
-		stream.on('error', def.resolve);
-		writeStream = createWriteStream(dest, options);
-		writeStream.on('error', def.resolve);
-		stream.pipe(writeStream);
-		writeStream.on('close', def.resolve);
+		read = createReadStream(source);
 	} catch (e) {
-		def.resolve(e);
+		return def.resolve(e);
+	}
+	try {
+		write = createWriteStream(dest, options);
+	} catch (e1) {
+		read.destroy();
+		return def.resolve(e1);
 	}
+
+	read.on('error', function (e) {
+		write.destroy();
+		def.resolve(e);
+	});
+	write.on('error', function (e) {
+		read.destroy();
+		def.resolve(e);
+	});
+	read.pipe(write);
+	write.on('close', def.resolve);
+
 	return def.promise;
 };
 copy.returnsPromise = true;
Improve error and stream handling in fs.copy