package goblincave.gitea.nes; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.io.FilenameUtils; import io.github.jacksonbrienen.jwfd.JWindowsFileDialog; public class AT3merge { public static void main(String[] args) throws IOException { String[] selection = JWindowsFileDialog.showMultiDialog(null, "Select AT3 files to merge"); boolean[] merged = new boolean[selection.length]; // identify AT3 part files: name_01.at3, name_02.at3 for(int a = 0; a < selection.length; a++) { if(merged[a]) continue; File fileA = new File(selection[a]); String filenameA = FilenameUtils.removeExtension(fileA.getName()); String partnameA = filenameA.substring(filenameA.length() - 3); filenameA = filenameA.substring(0, filenameA.length() - 3); if(partnameA.equals("_01")) { for(int b = 0; b < selection.length; b++) { if(merged[b] || selection[a].equals(selection[b])) continue; File fileB = new File(selection[b]); String filenameB = FilenameUtils.removeExtension(fileB.getName()); String partnameB = filenameB.substring(filenameB.length() - 3); filenameB = filenameB.substring(0, filenameB.length() - 3); if(filenameA.equals(filenameB) && partnameB.equals("_02")) { // MERGE parts into one file System.out.println("Merging " + fileA.getName() + " and " + fileB.getName()); merge(fileA, fileB); merged[b] = true; break; } } // REMOVE suffix from processed file System.out.println("Renaming to " + filenameA + ".at3"); if(fileA.renameTo(new File(fileA.getParent(), filenameA + ".at3"))); else System.out.println("Failed to rename " + fileA); merged[a] = true; } else continue; } // merge matching parts into a single file // remove part suffixes from files } /** * Appends fileB to the end of fileA. FileB is then deleted. * * @param fileA * @param fileB * @throws IOException */ private static void merge(File fileA, File fileB) throws IOException { try ( FileInputStream input = new FileInputStream(fileB); FileOutputStream output = new FileOutputStream(fileA, true); ) { // append fileB byte[] buffer = new byte[1024]; int bytesRead; while((bytesRead = input.read(buffer)) != -1) { output.write(buffer, 0, bytesRead); } } // delete fileB if(fileB.delete()); else System.out.println("Failed to delete " + fileB); } }