Hallo Tweakers,
dit kleine hobby project loopt al een tijdje en ik heb er een hoop van opgestoken!
Mijn doel is om uiteindelijk wat acties uit te voeren op een groot (+/- 6TB) aantal geluidsbestanden.
Het is me gelukt bestanden vrij rap te identificeren op een test set van 150+ GB, MAAR nu wil ik als perfectionist alles zo hebben als ik in gedachte heb, hoop ik
Waar ik bij vast loop is:
- Hoe kan ik er voor zorgen dat alleen dubbele in deze lijst komen bij iteratie, wat moet ik overriden ?
- Hoe zorg ik er voor dat deze lijst readonly wordt, misschien een klein voorbeeld?
- Eventueel nog andere tips om dit sneller te maken op een groot aantal bestanden.
dit kleine hobby project loopt al een tijdje en ik heb er een hoop van opgestoken!
Mijn doel is om uiteindelijk wat acties uit te voeren op een groot (+/- 6TB) aantal geluidsbestanden.
Het is me gelukt bestanden vrij rap te identificeren op een test set van 150+ GB, MAAR nu wil ik als perfectionist alles zo hebben als ik in gedachte heb, hoop ik
Waar ik bij vast loop is:
- Hoe kan ik er voor zorgen dat alleen dubbele in deze lijst komen bij iteratie, wat moet ik overriden ?
- Hoe zorg ik er voor dat deze lijst readonly wordt, misschien een klein voorbeeld?
- Eventueel nog andere tips om dit sneller te maken op een groot aantal bestanden.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
| /* var fileList = new DuplicateFileList(); fileList.Add(new DirectoryInfo(@"g:\sampling").GetFiles("*.*", SearchOption.AllDirectories)); //Console.WriteLine("Found {0} duplicate files.", fileList.Count); foreach(Collection<FileInfo> files in fileList) { if(files.Count > 1) { //Console.WriteLine("Found {0} duplicate file(s).", files[0].Name); } } Console.ReadKey(); */ class DuplicateFileList : List<Collection<FileInfo>> { const int BYTES_TO_READ = sizeof(Int64); protected Collection<long> _lengths = new Collection<long>(); protected Collection<string> _paths = new Collection<string>(); public DuplicateFileList() : base() { } public void Add(FileInfo file) { if(!_lengths.Contains(file.Length)) { //Console.WriteLine("New entry {0}", file.Length); _lengths.Add(file.Length); var newEntry = new Collection<FileInfo>(); newEntry.Add(file); Add(newEntry); } else if(!_paths.Contains(file.FullName)) { _paths.Add(file.FullName); FileInfo[] targetFilesCopy; foreach(Collection<FileInfo> targetFiles in this) { targetFilesCopy = new FileInfo[targetFiles.Count]; targetFiles.CopyTo(targetFilesCopy, 0); foreach(FileInfo targetFile in targetFilesCopy) { //Console.WriteLine("Comparing {0} : {1}", targetFile.Name, file.Name); if(CompareFiles(targetFile, file)) { targetFiles.Add(file); } } } } } public void Add(FileInfo[] files) { foreach(FileInfo file in files) { Add(file); } } protected bool CompareFiles(FileInfo first, FileInfo second) { if(first.Length != second.Length) { return false; } int iterations = (int)Math.Ceiling((double)first.Length / BYTES_TO_READ); using (FileStream fs1 = first.OpenRead()) using (FileStream fs2 = second.OpenRead()) { byte[] one = new byte[BYTES_TO_READ]; byte[] two = new byte[BYTES_TO_READ]; for (int i = 0; i < iterations; i++) { fs1.Read(one, 0, BYTES_TO_READ); fs2.Read(two, 0, BYTES_TO_READ); if (BitConverter.ToInt64(one,0) != BitConverter.ToInt64(two,0)) return false; } } return true; } } |