annotate Program.cs @ 0:8ac8eb805b6c default tip

Initial commit
author Ivo Smits <Ivo@UCIS.nl>
date Fri, 07 Feb 2014 23:23:08 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using System.Diagnostics;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 using System.Globalization;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using System.IO;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 using System.Windows.Forms;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 namespace AutoCRCheck {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8 static class Program {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 static Boolean DeleteBad = false;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 static String RenameBadSuffix = null;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 static Boolean WaitOnCompletion = false;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 static Boolean PrintMissing = false;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 static Boolean PrintMismatch = false;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 static UInt32 DirectoriesChecked = 0;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 static UInt32 ListsChecked = 0;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 static UInt32 FilesMissing = 0;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 static UInt32 FilesBad = 0;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 static UInt32 FilesGood = 0;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 [STAThread]
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 static int Main(String[] args) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 String rootdirectory = null;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22 Console.Error.WriteLine("UCIS AutoCRCheck (c) 2014 Ivo Smits <Ivo@UCIS.nl>");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 Console.Error.WriteLine("See http://wiki.ucis.nl/AutoCRCheck for more information");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 for (int i = 0; i < args.Length; i++) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 if (args[i].StartsWith("-")) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 switch (args[i].Substring(1)) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 case "d":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 case "delete":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 DeleteBad = true;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 break;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31 case "r":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 case "rename":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 RenameBadSuffix = args[++i];
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 break;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 case "w":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 case "wait":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 WaitOnCompletion = true;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 break;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 case "printmissing":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40 PrintMissing = true;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 break;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 case "p":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 case "printmismatch":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 PrintMismatch = true;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 break;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 case "help":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47 case "h":
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48 PrintCommandlineHelp(Console.Out);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 return -1;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 default:
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 Console.Error.WriteLine("Error: unknown command line argument: " + args[i]);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 PrintCommandlineHelp(Console.Error);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 return -1;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 } else {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 if (rootdirectory != null) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 Console.Error.WriteLine("Error: duplicate root directory specified.");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 return -1;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 rootdirectory = args[i];
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 if (rootdirectory == null) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 Console.Error.WriteLine("Root directory not set, waiting for GUI input...");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 try {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 using (new Control()) ;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67 } catch {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 Console.Error.WriteLine("It looks like you're trying to run this application in a non-GUI session. Luckily we're handling this nearly fatal error for you.");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69 PrintCommandlineHelp(Console.Error);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 return -1;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72 using (frmOptions options = new frmOptions()) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 DialogResult result = options.ShowDialog();
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 if (result != DialogResult.OK) return -2;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 rootdirectory = options.RootDirectory;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 DeleteBad = options.MismatchDelete;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77 RenameBadSuffix = options.MismatchRenameSuffix;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78 WaitOnCompletion = true;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 if (!Directory.Exists(rootdirectory)) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 Console.Error.WriteLine("Error: root directory not found.");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 return -1;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86 rootdirectory = Path.GetFullPath(rootdirectory);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 ScanDirectory(rootdirectory);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 String report = String.Format(
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 "{0} directories scanned.\n{1} .SFV files processed\n{2} files were missing\n{3} files had a mismatching checksum, they have been dealt with.\n{4} files are good",
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 DirectoriesChecked, ListsChecked, FilesMissing, FilesBad, FilesGood);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 Console.Error.WriteLine(report);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 Console.Error.WriteLine("Done.");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 if (WaitOnCompletion) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 MessageBox.Show("All files have been checked." + Environment.NewLine + report, "UCIS AutoCRCheck", MessageBoxButtons.OK, MessageBoxIcon.Information);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 return 0;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 static void PrintCommandlineHelp(TextWriter w) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 w.WriteLine("UCIS AutoCRCheck recursively checks directories for .SFV files and handles mismatching checksums as instructed.");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 w.WriteLine("Usage: AutoCRCheck.exe [options] [root directory]");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 w.WriteLine("Possible options:");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 w.WriteLine(" -delete Delete mismatching files");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 w.WriteLine(" -rename [suffix] Rename mismatching files, append [suffix] to filename");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 w.WriteLine(" -printmissing Print full path of missing files");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 w.WriteLine(" -printmismatch Print full path of mismatched files");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 w.WriteLine(" -wait Wait for user input when done");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 w.WriteLine(" -help Display this message");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 w.WriteLine();
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 w.WriteLine("Examples:");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 w.WriteLine(" AutoCRCheck.exe . -rename .badcrc");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 w.WriteLine(" AutoCRCheck.exe . -printmismatch > badfiles.txt");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 static void ScanDirectory(String dir) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 DirectoriesChecked++;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 Console.Error.WriteLine("Directory: {0}", dir);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 foreach (String sfv in Directory.GetFiles(dir, "*.sfv")) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 ListsChecked++;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 Console.Error.WriteLine("Checksum file: {0}", Path.GetFileName(sfv));
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 using (TextReader reader = File.OpenText(Path.Combine(dir, sfv))) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 while (true) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 String line = reader.ReadLine();
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 if (line == null) break;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 if (line.Length == 0 || line[0] == ';') continue;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 int lastspace = line.LastIndexOf(' ');
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 if (lastspace == -1) continue;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 String file = line.Substring(0, lastspace).TrimEnd(' ');
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 String cksumstr = line.Substring(lastspace);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 UInt32 goodcksum;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 if (!UInt32.TryParse(cksumstr, NumberStyles.HexNumber, null, out goodcksum)) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 Console.Error.WriteLine("Failed to decode checksum string: {0}", cksumstr);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 continue;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 String filepath = Path.Combine(dir, file);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 if (!File.Exists(filepath)) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 FilesMissing++;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 Console.Error.WriteLine("File not found: {0}", file);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 if (PrintMissing) Console.Out.WriteLine(filepath);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 continue;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 UInt32 realcksum;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 Console.Error.Write("Checking file: {0}... ", file);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 using (Stream input = File.OpenRead(filepath)) realcksum = CRCCalculate(input);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 if (goodcksum != realcksum) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 FilesBad++;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 Console.Error.WriteLine("Mismatch.");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 if (PrintMismatch) Console.Out.WriteLine(filepath);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 if (RenameBadSuffix != null) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148 File.Move(filepath, filepath + RenameBadSuffix);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 } else if (DeleteBad) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 File.Delete(filepath);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 } else {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 FilesGood++;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 Console.Error.WriteLine("Good.");
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159 foreach (String subdir in Directory.GetDirectories(dir)) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 ScanDirectory(Path.Combine(dir, subdir));
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 static readonly UInt32[] CRCTable = CRCGenerateTable();
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 static UInt32[] CRCGenerateTable() {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 UInt32[] table = new UInt32[256];
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 for (UInt32 v = 0; v < 256; v++) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 UInt32 e = CRCReflect(v, 8) << 24;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168 for (int i = 0; i < 8; i++) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 if ((e & 0x80000000L) == 0) e <<= 1;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 else e = (e << 1) ^ 0x04C11DB7;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172 table[v] = CRCReflect(e, 32);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 return table;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 static UInt32 CRCReflect(UInt32 r, int v) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 UInt32 ret = 0;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 for (int i = 1; i < v + 1; i++, r >>= 1) if ((r & 1) != 0) ret |= 1u << (v - i);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 return ret;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 static uint CRCCalculate(Stream input) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 uint c = 0xffffffff;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 Byte[] buffer = new Byte[Math.Min(1024, input.Length)];
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 while (true) {
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 int n = input.Read(buffer, 0, buffer.Length);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 if (n <= 0) break;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 for (int i = 0; i < n; i++) c = CRCTable[(c ^ buffer[i]) & 0xFF] ^ (c >> 8);
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 return c ^ 0xffffffff;
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 }
8ac8eb805b6c Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 }