2016-12-07 10:42:01 +00:00
|
|
|
package com.bytezone.diskbrowser.duplicates;
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
import java.util.*;
|
|
|
|
import java.util.zip.CRC32;
|
|
|
|
import java.util.zip.Checksum;
|
|
|
|
|
|
|
|
import com.bytezone.diskbrowser.disk.AppleDisk;
|
|
|
|
import com.bytezone.diskbrowser.disk.Disk;
|
|
|
|
import com.bytezone.diskbrowser.gui.FileComparator;
|
|
|
|
import com.bytezone.diskbrowser.utilities.Utility;
|
|
|
|
|
|
|
|
public class DuplicateHandler
|
|
|
|
{
|
|
|
|
private static final FileComparator fileComparator = new FileComparator ();
|
|
|
|
private static final int MAX_NAME_WIDTH = 34;
|
|
|
|
private static final String FORMAT = "%-" + MAX_NAME_WIDTH + "s %,10d%n";
|
|
|
|
|
|
|
|
private final File rootFolder;
|
|
|
|
private int totalDisks;
|
|
|
|
private int totalFolders;
|
|
|
|
|
|
|
|
// total files for each suffix
|
|
|
|
private final Map<String, Integer> typeList = new TreeMap<String, Integer> ();
|
|
|
|
|
|
|
|
// list of unique disk names -> List of File duplicates
|
|
|
|
final Map<String, List<DiskDetails>> duplicateDisks =
|
|
|
|
new TreeMap<String, List<DiskDetails>> ();
|
|
|
|
|
|
|
|
// list of unique disk names -> File
|
|
|
|
private final Map<String, File> diskNames = new HashMap<String, File> ();
|
|
|
|
|
|
|
|
// list of checksum -> File
|
|
|
|
final Map<Long, List<File>> dosMap = new TreeMap<Long, List<File>> ();
|
|
|
|
|
|
|
|
public DuplicateHandler (File rootFolder)
|
|
|
|
{
|
|
|
|
this.rootFolder = rootFolder;
|
2016-12-08 01:19:18 +00:00
|
|
|
|
2016-12-07 10:42:01 +00:00
|
|
|
countDisks ();
|
|
|
|
}
|
|
|
|
|
2016-12-08 01:19:18 +00:00
|
|
|
public Map<String, List<DiskDetails>> getDuplicateDisks ()
|
|
|
|
{
|
|
|
|
return duplicateDisks;
|
|
|
|
}
|
|
|
|
|
2016-12-07 10:42:01 +00:00
|
|
|
void countDisks ()
|
|
|
|
{
|
2016-12-08 01:19:18 +00:00
|
|
|
traverse (rootFolder);
|
2016-12-07 10:42:01 +00:00
|
|
|
|
2016-12-08 01:19:18 +00:00
|
|
|
System.out.printf ("%nFolders ..... %,7d%n", totalFolders);
|
|
|
|
System.out.printf ("Disks ....... %,7d%n%n", totalDisks);
|
2016-12-07 10:42:01 +00:00
|
|
|
|
|
|
|
int grandTotal = 0;
|
|
|
|
for (String key : typeList.keySet ())
|
|
|
|
{
|
|
|
|
int typeTotal = typeList.get (key);
|
|
|
|
grandTotal += typeTotal;
|
2016-12-08 01:19:18 +00:00
|
|
|
System.out.printf ("%13.13s %,7d%n", key + " ...........", typeTotal);
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|
2016-12-08 01:19:18 +00:00
|
|
|
System.out.printf ("%nTotal ....... %,7d%n%n", grandTotal);
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|
|
|
|
|
2016-12-08 01:19:18 +00:00
|
|
|
private void traverse (File directory)
|
2016-12-07 10:42:01 +00:00
|
|
|
{
|
|
|
|
File[] files = directory.listFiles ();
|
|
|
|
if (files == null || files.length == 0)
|
|
|
|
{
|
|
|
|
System.out.println ("Empty folder : " + directory.getAbsolutePath ());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Arrays.sort (files, fileComparator);
|
|
|
|
|
2016-12-08 01:19:18 +00:00
|
|
|
if (false)
|
|
|
|
System.out.printf ("%nFolder: %s%n%n", directory.getAbsolutePath ()
|
|
|
|
.substring (rootFolder.getAbsolutePath ().length ()));
|
2016-12-07 10:42:01 +00:00
|
|
|
|
|
|
|
for (File file : files)
|
|
|
|
{
|
|
|
|
if (file.isDirectory ())
|
|
|
|
{
|
|
|
|
++totalFolders;
|
2016-12-08 01:19:18 +00:00
|
|
|
traverse (file);
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|
|
|
|
else if (Utility.validFileType (file.getName ()))
|
|
|
|
{
|
|
|
|
if (file.getName ().endsWith (".gz") && !file.getName ().endsWith ("dsk.gz"))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
++totalDisks;
|
|
|
|
|
2016-12-08 01:19:18 +00:00
|
|
|
int pos = file.getName ().lastIndexOf ('.');
|
|
|
|
if (pos > 0)
|
|
|
|
{
|
|
|
|
String type = file.getName ().substring (pos + 1).toLowerCase ();
|
|
|
|
if (typeList.containsKey (type))
|
|
|
|
{
|
|
|
|
int t = typeList.get (type);
|
|
|
|
typeList.put (type, ++t);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
typeList.put (type, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (false)
|
|
|
|
{
|
|
|
|
String name = file.getName ();
|
|
|
|
int nameLength = name.length ();
|
|
|
|
if (nameLength > MAX_NAME_WIDTH)
|
|
|
|
name = name.substring (0, 15) + "..."
|
|
|
|
+ name.substring (nameLength - MAX_NAME_WIDTH + 18);
|
|
|
|
|
|
|
|
System.out.printf (FORMAT, name, file.length ());
|
|
|
|
}
|
|
|
|
|
|
|
|
checkDuplicates (file);
|
|
|
|
// checksumDos (file);
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|
|
|
|
}
|
2016-12-08 01:19:18 +00:00
|
|
|
|
|
|
|
if (false)
|
|
|
|
for (String key : duplicateDisks.keySet ())
|
|
|
|
{
|
|
|
|
List<DiskDetails> diskDetailsList = duplicateDisks.get (key);
|
|
|
|
System.out.println (key);
|
|
|
|
for (DiskDetails diskDetails : diskDetailsList)
|
|
|
|
System.out.println (diskDetails);
|
|
|
|
}
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private void checksumDos (File file)
|
|
|
|
{
|
|
|
|
if (file.length () != 143360 || file.getAbsolutePath ().contains ("/ZDisks/"))
|
|
|
|
return;
|
|
|
|
|
|
|
|
Disk disk = new AppleDisk (file, 35, 16);
|
|
|
|
byte[] buffer = disk.readSector (0, 0);
|
|
|
|
|
|
|
|
Checksum checksum = new CRC32 ();
|
|
|
|
checksum.update (buffer, 0, buffer.length);
|
|
|
|
long cs = checksum.getValue ();
|
|
|
|
List<File> files = dosMap.get (cs);
|
|
|
|
if (files == null)
|
|
|
|
{
|
|
|
|
files = new ArrayList<File> ();
|
|
|
|
dosMap.put (cs, files);
|
|
|
|
}
|
|
|
|
files.add (file);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void checkDuplicates (File file)
|
|
|
|
{
|
|
|
|
if (diskNames.containsKey (file.getName ()))
|
|
|
|
{
|
|
|
|
List<DiskDetails> diskList = duplicateDisks.get (file.getName ());
|
|
|
|
if (diskList == null)
|
|
|
|
{
|
|
|
|
diskList = new ArrayList<DiskDetails> ();
|
|
|
|
duplicateDisks.put (file.getName (), diskList);
|
|
|
|
diskList.add (new DiskDetails (diskNames.get (file.getName ())));// add original
|
|
|
|
}
|
|
|
|
diskList.add (new DiskDetails (file)); // add the duplicate
|
|
|
|
}
|
|
|
|
else
|
|
|
|
diskNames.put (file.getName (), file);
|
|
|
|
}
|
|
|
|
|
2016-12-08 01:19:18 +00:00
|
|
|
// public static void main (String[] args)
|
|
|
|
// {
|
|
|
|
// DuplicateHandler dh = new DuplicateHandler (
|
|
|
|
// new File ("/Users/denismolony/Apple II stuff/AppleDisk Images II/apple disks"));
|
|
|
|
// }
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|