diff --git a/chrome/content/zotero/xpcom/attachments.js b/chrome/content/zotero/xpcom/attachments.js index b480457e5a..81bb0da4a7 100644 --- a/chrome/content/zotero/xpcom/attachments.js +++ b/chrome/content/zotero/xpcom/attachments.js @@ -1128,9 +1128,9 @@ Zotero.Attachments = new function(){ // Copy over files if they exist if (newAttachment.isImportedAttachment() && attachment.getFile()) { - var dir = Zotero.Attachments.getStorageDirectory(attachment); - var newDir = yield Zotero.Attachments.createDirectoryForItem(newAttachment); - Zotero.File.copyDirectory(dir, newDir); + let dir = Zotero.Attachments.getStorageDirectory(attachment); + let newDir = yield Zotero.Attachments.createDirectoryForItem(newAttachment); + yield Zotero.File.copyDirectory(dir, newDir); } yield newAttachment.addLinkedItem(attachment); diff --git a/chrome/content/zotero/xpcom/file.js b/chrome/content/zotero/xpcom/file.js index 413ae8e35f..b181698cb9 100644 --- a/chrome/content/zotero/xpcom/file.js +++ b/chrome/content/zotero/xpcom/file.js @@ -583,18 +583,26 @@ Zotero.File = new function(){ /** * Copies all files from dir into newDir + * + * @param {String|nsIFile} source - Source directory + * @param {String|nsIFile} target - Target directory */ - this.copyDirectory = function (dir, newDir) { - if (!dir.exists()) { - throw ("Directory doesn't exist in Zotero.File.copyDirectory()"); - } - var otherFiles = dir.directoryEntries; - while (otherFiles.hasMoreElements()) { - var file = otherFiles.getNext(); - file.QueryInterface(Components.interfaces.nsIFile); - file.copyTo(newDir, null); - } - } + this.copyDirectory = Zotero.Promise.coroutine(function* (source, target) { + if (source instanceof Ci.nsIFile) source = source.path; + if (target instanceof Ci.nsIFile) target = target.path; + + yield OS.File.makeDir(target, { + ignoreExisting: true, + unixMode: 0o755 + }); + + return this.iterateDirectory(source, function* (iterator) { + while (true) { + let entry = yield iterator.next(); + yield OS.File.copy(entry.path, OS.Path.join(target, entry.name)); + } + }) + }); this.createDirectoryIfMissing = function (dir) { diff --git a/test/tests/fileTest.js b/test/tests/fileTest.js new file mode 100644 index 0000000000..babf4509f5 --- /dev/null +++ b/test/tests/fileTest.js @@ -0,0 +1,31 @@ +describe("Zotero.File", function () { + describe("#copyDirectory()", function () { + it("should copy all files within a directory", function* () { + var tmpDir = Zotero.getTempDirectory().path; + var tmpCopyDir = OS.Path.join(tmpDir, "copyDirectory") + var source = OS.Path.join(tmpCopyDir, "1"); + var target = OS.Path.join(tmpCopyDir, "2"); + yield OS.File.makeDir(source, { + from: tmpDir + }); + + yield Zotero.File.putContentsAsync(OS.Path.join(source, "A"), "Test 1"); + yield Zotero.File.putContentsAsync(OS.Path.join(source, "B"), "Test 2"); + + yield OS.File.removeDir(target, { + ignoreAbsent: true + }); + + yield Zotero.File.copyDirectory(source, target); + + assert.equal( + (yield Zotero.File.getContentsAsync(OS.Path.join(target, "A"))), + "Test 1" + ); + assert.equal( + (yield Zotero.File.getContentsAsync(OS.Path.join(target, "B"))), + "Test 2" + ); + }) + }) +})