diff --git a/docker-compose.yml b/docker-compose.yml
index c88bcfd..bd68197 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,5 +1,6 @@
services:
discord-archive:
+ image: git.thecozycat.net/aj/discordarchivemanager:latest
build: .
volumes:
- ./input:/app/input
diff --git a/docker-publish.cmd b/docker-publish.cmd
new file mode 100644
index 0000000..d50f456
--- /dev/null
+++ b/docker-publish.cmd
@@ -0,0 +1,2 @@
+docker build -t git.thecozycat.net/aj/discordarchivemanager:latest .
+docker push git.thecozycat.net/aj/discordarchivemanager:latest
\ No newline at end of file
diff --git a/src/DiscordArchiveManager/Services/ArchiveService.cs b/src/DiscordArchiveManager/Services/ArchiveService.cs
index a96d349..4686d4d 100644
--- a/src/DiscordArchiveManager/Services/ArchiveService.cs
+++ b/src/DiscordArchiveManager/Services/ArchiveService.cs
@@ -36,7 +36,7 @@ public class ArchiveService
// Archive the JSON file
var archivedJsonPath = Path.Combine(archivePath, jsonFileName);
var uniqueJsonPath = GetUniquePath(archivedJsonPath);
- File.Move(jsonFilePath, uniqueJsonPath);
+ MoveFile(jsonFilePath, uniqueJsonPath);
_logger.LogInformation("Archived JSON file to {Path}", uniqueJsonPath);
// Archive the _Files directory if it exists
@@ -45,7 +45,7 @@ public class ArchiveService
var filesDirectoryName = Path.GetFileName(filesDirectory);
var archivedFilesPath = Path.Combine(archivePath, filesDirectoryName);
var uniqueFilesPath = GetUniquePath(archivedFilesPath);
- Directory.Move(filesDirectory, uniqueFilesPath);
+ MoveDirectory(filesDirectory, uniqueFilesPath);
_logger.LogInformation("Archived files directory to {Path}", uniqueFilesPath);
}
@@ -152,6 +152,58 @@ public class ArchiveService
}
}
+ ///
+ /// Moves a file, falling back to copy+delete for cross-device moves.
+ ///
+ private static void MoveFile(string source, string destination)
+ {
+ try
+ {
+ File.Move(source, destination);
+ }
+ catch (IOException)
+ {
+ File.Copy(source, destination);
+ File.Delete(source);
+ }
+ }
+
+ ///
+ /// Moves a directory, falling back to copy+delete for cross-device moves.
+ ///
+ private static void MoveDirectory(string source, string destination)
+ {
+ try
+ {
+ Directory.Move(source, destination);
+ }
+ catch (IOException)
+ {
+ CopyDirectory(source, destination);
+ Directory.Delete(source, true);
+ }
+ }
+
+ ///
+ /// Recursively copies a directory.
+ ///
+ private static void CopyDirectory(string source, string destination)
+ {
+ Directory.CreateDirectory(destination);
+
+ foreach (var file in Directory.GetFiles(source))
+ {
+ var destFile = Path.Combine(destination, Path.GetFileName(file));
+ File.Copy(file, destFile);
+ }
+
+ foreach (var dir in Directory.GetDirectories(source))
+ {
+ var destDir = Path.Combine(destination, Path.GetFileName(dir));
+ CopyDirectory(dir, destDir);
+ }
+ }
+
///
/// Gets a unique file/directory path by appending a number if the path already exists.
///