diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CopyFileCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CopyFileCommand.java index a38d8c4..967cb55 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CopyFileCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/CopyFileCommand.java @@ -19,16 +19,14 @@ */ package io.github.applecommander.acx.command; -import java.util.List; -import java.util.logging.Logger; -import java.util.stream.Collectors; - -import com.webcodepro.applecommander.storage.*; +import com.webcodepro.applecommander.storage.DirectoryEntry; +import com.webcodepro.applecommander.storage.Disk; +import com.webcodepro.applecommander.storage.DiskException; +import com.webcodepro.applecommander.storage.FileEntry; import com.webcodepro.applecommander.util.Name; import com.webcodepro.applecommander.util.filestreamer.FileStreamer; import com.webcodepro.applecommander.util.filestreamer.FileTuple; import com.webcodepro.applecommander.util.filestreamer.TypeOfFile; - import io.github.applecommander.acx.base.ReadWriteDiskCommandOptions; import io.github.applecommander.acx.converter.DiskConverter; import io.github.applecommander.acx.fileutil.FileUtils; @@ -36,6 +34,10 @@ import picocli.CommandLine.Command; import picocli.CommandLine.Option; import picocli.CommandLine.Parameters; +import java.util.List; +import java.util.logging.Logger; +import java.util.stream.Collectors; + @Command(name = "copy", description = "Copy files between disks.", aliases = { "cp" }) public class CopyFileCommand extends ReadWriteDiskCommandOptions { @@ -63,7 +65,7 @@ public class CopyFileCommand extends ReadWriteDiskCommandOptions { List files = FileStreamer.forDisk(sourceDisk) .ignoreErrors(true) .includeTypeOfFile(TypeOfFile.BOTH) - .recursive(recursiveFlag) + .recursive(false) // we handle recursion in the FileUtils .matchGlobs(globs) .stream() .collect(Collectors.toList()); diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/fileutil/FileUtils.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/fileutil/FileUtils.java index 9891370..35729ff 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/fileutil/FileUtils.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/fileutil/FileUtils.java @@ -19,17 +19,16 @@ */ package io.github.applecommander.acx.fileutil; -import java.util.Optional; -import java.util.logging.Logger; - import com.webcodepro.applecommander.storage.DirectoryEntry; import com.webcodepro.applecommander.storage.DiskException; import com.webcodepro.applecommander.storage.FileEntry; import com.webcodepro.applecommander.util.readerwriter.FileEntryReader; import com.webcodepro.applecommander.util.readerwriter.FileEntryWriter; - import io.github.applecommander.acx.command.CopyFileCommand; +import java.util.Optional; +import java.util.logging.Logger; + public class FileUtils { private static Logger LOG = Logger.getLogger(CopyFileCommand.class.getName()); @@ -40,7 +39,7 @@ public class FileUtils { } public void copy(DirectoryEntry directory, FileEntry file) throws DiskException { - LOG.fine(() -> String.format("Copying '%s'", file.getFilename())); + LOG.fine(() -> String.format("Copying '%s' into directory '%s'", file.getFilename(), directory.getDirname())); if (file.isDeleted()) { // Skip deleted files } @@ -112,13 +111,15 @@ public class FileUtils { source.getBinaryAddress().ifPresent(target::setBinaryAddress); source.getBinaryLength().ifPresent(target::setBinaryLength); source.getAuxiliaryType().ifPresent(target::setAuxiliaryType); - source.getCreationDate().ifPresent(target::setCreationDate); - source.getLastModificationDate().ifPresent(target::setLastModificationDate); + source.getCreationDate().ifPresent(target::setCreationDate); if (source.getFileData().isPresent() && source.getResourceData().isPresent()) { target.setFileData(source.getFileData().get(), source.getResourceData().get()); } else { source.getFileData().ifPresent(target::setFileData); } + + // Modification date needs to be done last since writing file data/attributes are likely to change it + source.getLastModificationDate().ifPresent(target::setLastModificationDate); } } diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/DirectoryEntry.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/DirectoryEntry.java index 88ecfef..3c4bd58 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/DirectoryEntry.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/DirectoryEntry.java @@ -33,6 +33,11 @@ import java.util.List; * @author Lisias Toledo */ public interface DirectoryEntry { + /** + * Return a name for this directory. + */ + public String getDirname(); + /** * Retrieve the list of files in this directory. * Note that if this is not a directory, the return diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/FormattedDisk.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/FormattedDisk.java index 2b58e6b..aeafbef 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/FormattedDisk.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/FormattedDisk.java @@ -140,7 +140,14 @@ public abstract class FormattedDisk extends Disk implements DirectoryEntry { * but "DISK VOLUME #xxx" (DOS 3.3) or "/MY.DISK" (ProDOS). */ public abstract String getDiskName(); - + + /** + * Return a name for this directory. + */ + public String getDirname(){ + return getDiskName(); + } + /** * Set the name of the disk to volumeName. */ diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosDirectoryEntry.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosDirectoryEntry.java index 33eaf6e..b8d3061 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosDirectoryEntry.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosDirectoryEntry.java @@ -19,13 +19,13 @@ */ package com.webcodepro.applecommander.storage.os.prodos; -import java.util.List; - import com.webcodepro.applecommander.storage.DirectoryEntry; import com.webcodepro.applecommander.storage.DiskException; import com.webcodepro.applecommander.storage.DiskFullException; import com.webcodepro.applecommander.storage.FileEntry; +import java.util.List; + /** * Implement directory functionality. *

@@ -55,6 +55,13 @@ public class ProdosDirectoryEntry extends ProdosFileEntry implements DirectoryEn return this.subdirectoryHeader; } + /** + * Return a name for this directory. + */ + public String getDirname(){ + return getFilename(); + } + /** * Retrieve the list of files in this directory. * Note that if this is not a directory, the return