/// <summary> /// Files Comparison of Comparator /// </summary> /// <param name="result">SyncResult Object to catch Exception Thrown</param> /// <param name="resultAlbum">Result Album to Store Result</param> /// <param name="sourceAlbum">Source Album being Compared</param> /// <param name="targetAlbum">Target Album being Compared</param> private void compareFiles(SyncResult result, Album[] resultAlbum, Album sourceAlbum, Album targetAlbum) { try { /* Get the necessary Metadatas and Files (in string) */ List<Files> sourceMetadata = sourceAlbum.getMetadata(); // S' List<Files> targetMetadata = targetAlbum.getMetadata(); // T' List<string> sourceFiles = getFilesFromPath(sourceAlbum.getPath()); // S List<string> targetFiles = getFilesFromPath(targetAlbum.getPath()); // T /* Merge the Lists into a single List containing all filename (in string) */ List<string> listUnion = mergeLists(sourceAlbum.getPath(), targetAlbum.getPath(), sourceFiles, targetFiles, sourceMetadata, targetMetadata); /* Boolean values for Comparison Logic: */ bool sOne; // File exist in S bool tOne; // File exist in T bool sTwo; // File exist in S' bool tTwo; // File exist in T' bool sS; // S.File == S'.File bool tT; // T.File == T'.File bool ST; // S.File == T.File /* Comparison Logic: */ foreach (string filenames in listUnion) { String filename = filenames; //Console.WriteLine("file: " + filename); if (filename.Contains(PATH_DELIMITER)) { filename = filename.Replace(PATH_DELIMITER, ""); } /* Get the boolean values for the first 4 variables: */ sOne = isFileExist(Album.combinePath(sourceAlbum.getPath(), filename), sourceFiles); // Source FileSystem (S) Exist tOne = isFileExist(Album.combinePath(targetAlbum.getPath(), filename), targetFiles); // Target FileSystem (T) Exist sTwo = isFileExist(Album.combinePath(sourceAlbum.getPath(), filename), sourceMetadata); // Source Metadata (S') Exist tTwo = isFileExist(Album.combinePath(targetAlbum.getPath(), filename), targetMetadata); // Target Metadata (T') Exist /* Envelope Check: */ // To Check: Use Binary of the form sOne sTwo tOne tTwo // e.g.: if true true false true -> 1101 = 13 if (sOne && sTwo && tOne && tTwo) // 1111 = 15 { /* Get boolean for sS tT ST */ Files sourceMTDT = getPhotoFromFilename(sourceMetadata, filename); Files targetMTDT = getPhotoFromFilename(targetMetadata, filename); // Use Factory Method Pattern Files sourceFile = Files.getFilesObject(Album.combinePath(sourceAlbum.getPath(), filename)); Files targetFile = Files.getFilesObject(Album.combinePath(targetAlbum.getPath(), filename)); // Check Files Read and Write Access if (sourceFile == null || targetFile == null) continue; sS = sourceFile.equals(sourceMTDT); tT = targetFile.equals(targetMTDT); ST = sourceFile.equals(targetFile); /* Inner Check: */ if (sS && tT && ST) // 111 = 7 { // EQUAL: Ignore continue; } else if (sS && tT && !ST) // 110 = 6 { /* Check for Modification Date and File Size */ checkModificationDate(resultAlbum, sourceFile, targetFile); continue; } else if (sS && !tT && ST) // 101 = 5 { // UPDATE T' targetMTDT.update(targetFile); continue; } else if (sS && !tT && !ST) // 100 = 4 { // TARGET IS NEWER: Add target file to resultAlbum[TARGET_LATEST] resultAlbum[TARGET_LATEST].add(targetFile); continue; } else if (!sS && tT && ST) // 011 = 3 { // UPDATE S' sourceMTDT.update(sourceFile); continue; } else if (!sS && tT && !ST) // 010 = 2 { // SOURCE IS NEWER: Add source file to resultAlbum[SOURCE_LATEST] resultAlbum[SOURCE_LATEST].add(sourceFile); continue; } else if (!sS && !tT && ST) // 001 = 1 { // UPDATE S' & UPDATE T' sourceMTDT.update(sourceFile); targetMTDT.update(targetFile); continue; } else // 000 = 0 { // CONFLICT FILE: Add source file to resultAlbum[SOURCE_CONFLICT] // Add target file to resultAlbum[TARGET_CONFLICT] resultAlbum[SOURCE_CONFLICT].add(sourceFile); resultAlbum[TARGET_CONFLICT].add(targetFile); continue; } } else if (sOne && sTwo && !tOne && tTwo) // 1101 = 13 { /* Get boolean for sS tT ST */ Files sourceMTDT = getPhotoFromFilename(sourceMetadata, filename); // Use Factory Method Pattern //Files sourceFile = new Photo(Album.combinePath(sourceAlbum.getPath(), filename)); Files sourceFile = Files.getFilesObject(Album.combinePath(sourceAlbum.getPath(), filename)); // Check Files Read and Write Access if (sourceFile == null) continue; sS = sourceFile.equals(sourceMTDT); if (sS) { // TARGET IS DELETED: Add source file to resultAlbum[SOURCE_DELETE] targetAlbum.trim(Album.combinePath(targetAlbum.getPath(), filename), Album.TRIM_METADATA); resultAlbum[SOURCE_DELETE].add(sourceFile); continue; } else { // SOURCE IS CHANGED: Takes precedence over deletion // Add source to resultAlbum[SOURCE_LATEST]; resultAlbum[SOURCE_LATEST].add(sourceFile); continue; } } else if (sOne && !sTwo && tOne && !tTwo) // 1010 = 10 { /* Get boolean for ST */ // Use Factory Method Pattern //Files sourceFile = new Photo(Album.combinePath(sourceAlbum.getPath(), filename)); //Files targetFile = new Photo(Album.combinePath(targetAlbum.getPath(), filename)); Files sourceFile = Files.getFilesObject(Album.combinePath(sourceAlbum.getPath(), filename)); Files targetFile = Files.getFilesObject(Album.combinePath(targetAlbum.getPath(), filename)); // Check Files Read and Write Access if (sourceFile == null || targetFile == null) continue; ST = sourceFile.equals(targetFile); /* Inner Check: */ if (!ST) // 0 { /* Check for Modification Date and File Size: */ checkModificationDate(resultAlbum, sourceFile, targetFile); } /* CREATE S' & CREATE T' */ sourceAlbum.add(sourceFile); targetAlbum.add(targetFile); continue; } else if (sOne && !sTwo && !tOne && !tTwo) // 1000 = 08 { // SOURCE IS NEWER: Add source file to resultAlbum[SOURCE_LATEST] // Use Factory Method Pattern Files sourceFile = Files.getFilesObject(Album.combinePath(sourceAlbum.getPath(), filename)); Files targetFile = Files.getFilesObject(Album.combinePath(sourceAlbum.getPath(), filename)); // Check Files Read and Write Access if (sourceFile == null || targetFile == null) continue; targetFile.setFullpath(Album.combinePath(targetAlbum.getPath(), filename)); resultAlbum[SOURCE_LATEST].add(sourceFile); /* CREATE S' & CREATE T' */ sourceAlbum.add(sourceFile); targetAlbum.add(targetFile); continue; } else if (!sOne && sTwo && tOne && tTwo) // 0111 = 07 { /* Get boolean for sS tT ST */ Files targetMTDT = getPhotoFromFilename(targetMetadata, filename); // Use Factory Method Pattern Files targetFile = Files.getFilesObject(Album.combinePath(targetAlbum.getPath(), filename)); // Check Files Read and Write Access if (targetFile == null) continue; tT = targetFile.equals(targetMTDT); if (tT) { // SOURCE IS DELETED: Add target file to resultAlbum[TARGET_DELETE] sourceAlbum.trim(Album.combinePath(sourceAlbum.getPath(), filename), Album.TRIM_METADATA); resultAlbum[TARGET_DELETE].add(targetFile); continue; } else { // TARGET IS CHANGED: Takes precedence over deletion // Add to resultAlbum[TARGET_LATEST] resultAlbum[TARGET_LATEST].add(targetFile); continue; } } else if (!sOne && sTwo && !tOne && tTwo) // 0101 = 05 { Files sourceMTDT = getPhotoFromFilename(sourceMetadata, filename); Files targetMTDT = getPhotoFromFilename(targetMetadata, filename); // REMOVE S' REMOVE T' sourceAlbum.trim(Album.combinePath(sourceAlbum.getPath(), filename), Album.TRIM_METADATA); targetAlbum.trim(Album.combinePath(targetAlbum.getPath(), filename), Album.TRIM_METADATA); continue; } else if (!sOne && !sTwo && tOne && !tTwo) // 0010 = 02 { // TARGET IS NEWER: Add target file to resultAlbum[TARGET_LATEST] // Use Factory Method Pattern Files targetFile = Files.getFilesObject(Album.combinePath(targetAlbum.getPath(), filename)); Files sourceFile = Files.getFilesObject(Album.combinePath(targetAlbum.getPath(), filename)); // Check Files Read and Write Access if (targetFile == null || sourceFile == null) continue; sourceFile.setFullpath(Album.combinePath(sourceAlbum.getPath(), filename)); resultAlbum[TARGET_LATEST].add(targetFile); /* CREATE S' & CREATE T' */ sourceAlbum.add(sourceFile); targetAlbum.add(targetFile); continue; } else // 1110 = 14 ; 1101 = 12 ; 1011 = 11 // 1001 = 09 ; 0110 = 06 ; 0100 = 04 // 0011 = 03 ; 0001 = 01 ; 0000 = 00 { throw new Exception(INVALID_FILES); } } } catch (Exception e) { result.uaeThrown(); } }
/// <summary> /// Runs the backup job. /// </summary> /// <param name="source">Album retreived from backup()</param> public void backupMove(Album source) { string srcPath, trgPath; #region Backing up from Source to Target // Back up folders. foreach (Album temp in source.getSubAlbum()) { srcPath = temp.getPath(); trgPath = srcPath.Replace(job.getSource().getPath(), job.getTarget().getPath()); mover.move(srcPath, trgPath, Mover.MOVE_BACK_UP); } // Back up files. foreach (Files temp in source.getMetadata()) { srcPath = temp.getFullpath(); trgPath = srcPath.Replace(job.getSource().getPath(), job.getTarget().getPath()); mover.move(srcPath, trgPath, Mover.MOVE_BACK_UP); } #endregion if (mover.getMoverError()) MessageBox.Show("Some file are unable to move. Check the log file for details.", "Error on Moving"); // Resets the mover and logs the completion. mover.resetMover(); mover.getLogger().logJobEnded(job.getJobName()); // Saves the meta data and job name list saveJobList(); saveJobNameList(); }
private Album append(Album original, Album appendix) { Album appended = new Album(DIFF_ALBUM_NAME, ""); /* Get Files: */ foreach (Files metadata in original.getMetadata()) { appended.add(metadata); } foreach (Files metadata in appendix.getMetadata()) { appended.add(metadata); } /* Get Sub Folders: */ foreach (Album subAlbum in original.getSubAlbum()) { appended.add(subAlbum); } foreach (Album subAlbum in appendix.getSubAlbum()) { appended.add(subAlbum); } return appended; }