Erweiterungsmethoden für FileInfo, die die Prüfsumme der Datei berechnen. Unterstützt werden MD5, SHA1 und SHA256. Das Berechnen funktioniert auch bei sehr großen Dateien, da die Prüfsummen schrittweise berechnet werden und sich nicht die komplette Datei im Speicher befinden muss.
Beispiel:
var file = new FileInfo(@"C:\my_big_file.bin");
var md5 = file.GetMD5Hash();
using System.IO;
using System.Security.Cryptography;
public static class FileInfoExtension
{
/// <summary>
/// Gibt eine Bytefolge in Hexadezimaldarstellung aus.
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static string ToHexString(IEnumerable<byte> data)
{
var sb = new StringBuilder();
foreach (byte b in data)
{
sb.AppendFormat("{0:X2}", b);
}
return sb.ToString();
}
/// <summary>
/// Berechnet mithilfe des übergebenen HashAlgorithm den Hash eines FileStreams.
/// </summary>
/// <param name="stream"></param>
/// <param name="algorithm"></param>
/// <returns></returns>
private static string GetHash(FileStream stream, HashAlgorithm algorithm)
{
var buffer = new byte[4096];
int count;
while ((count = stream.Read(buffer, 0, buffer.Length)) > 0)
{
int offset = 0;
while (offset < count)
offset += algorithm.TransformBlock(buffer, offset, count - offset, buffer, offset);
}
algorithm.TransformFinalBlock(buffer, 0, 0);
return ToHexString(algorithm.Hash);
}
/// <summary>
/// Berechnet den MD5 Hash einer Datei.
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static string GetMD5Hash(this FileInfo file)
{
using (var stream = file.OpenRead())
{
using (var md5 = MD5.Create())
{
return GetHash(stream, md5);
}
}
}
/// <summary>
/// Berechnet den SHA1 Hash einer Datei.
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static string GetSHA1Hash(this FileInfo file)
{
using (var stream = file.OpenRead())
{
using (var sha1 = SHA1.Create())
{
return GetHash(stream, sha1);
}
}
}
/// <summary>
/// Berechnet den SHA256 Hash einer Datei.
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static string GetSHA256Hash(this FileInfo file)
{
using (var stream = file.OpenRead())
{
using (var sha1 = SHA256.Create())
{
return GetHash(stream, sha1);
}
}
}
}
1 Kommentare zum Snippet