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. ///