特定のフォルダ以下のファイルをハッシュで比較してみる。過去に何度かファイル破損したことがあったので実験。
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 |
using System; using System.Linq; using System.IO; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string srcBasePath = @"C:\Users\xxx\Desktop\1"; string dstBasePath = @"C:\Users\xxx\Desktop\2"; foreach(var p in Directory.EnumerateFiles(srcBasePath, "*", SearchOption.AllDirectories)) { // 除外する拡張子とファイル名 if (Path.GetExtension(p) == ".db") continue; if (Path.GetFileName (p) == "desktop.ini") continue; string srcHash = FileHash(p); string dstHash = FileHash(p.Replace(srcBasePath, dstBasePath)); if (srcHash == dstHash) { // ハッシュが一致した場合。 } else if (srcHash != dstHash) { // ハッシュが一致しない場合。 Console.WriteLine(p.Replace(srcBasePath, dstBasePath)); Console.WriteLine(dstHash); } } Console.WriteLine("続行するには何かキーを押してください..."); Console.ReadKey(); } private static string FileHash(string path) { // 先頭から指定バイト分でハッシュを出しているので、指定以降の不一致ではエラーにならない try { using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { var b = new byte[1024 * 1024]; // 1MB fs.Read(b, 0, 1024 * 1024); using (var ms = new MemoryStream(b)) { var hashProvider = new System.Security.Cryptography.SHA256CryptoServiceProvider(); var bs = hashProvider.ComputeHash(ms); return String.Join("", bs.Select(x => x.ToString("x2")).ToArray()); // BitConverterと結果は同じで違う書き方 } } } catch (Exception) { return ""; } } private static string FileHash2(string path) { // ファイル全てを利用するため、サイズが大きいと時間がかかる。 try { using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { var hashProvider = new System.Security.Cryptography.SHA256CryptoServiceProvider(); var bs = hashProvider.ComputeHash(fs); return BitConverter.ToString(bs).ToLower().Replace("-", ""); } } catch(Exception e) { return e.Message; } } } } |