private void DirectSet(byte[] sha1Code, byte[] sha256Code, byte[] md5Code) { this.fileFingerprintType = FileFingerprintType.None; if (sha1Code != null) { if (sha1Code.Length != 20) { throw new ArgumentException("SHA1 code length must be 20.", "sha1Code"); } this.fileFingerprintType |= FileFingerprintType.SHA1; } if (sha256Code != null) { if (sha256Code.Length != 32) { throw new ArgumentException("SHA256 code length must be 32.", "sha1Code"); } this.fileFingerprintType |= FileFingerprintType.SHA256; } if (md5Code != null) { if (md5Code.Length != 16) { throw new ArgumentException("MD5 code length must be 16.", "sha1Code"); } this.fileFingerprintType |= FileFingerprintType.MD5; } this.sha1Code = sha1Code; this.sha256Code = sha256Code; this.md5Code = md5Code; }
/// <summary> /// 取两个指纹共同指纹类型进行比较。 /// </summary> /// <remarks> /// 当没有共同的指纹类型是将抛出`ArgumentException`。 /// </remarks> public bool IsFileFingerprintSameMin(FileFingerprint fileFingerprint1, FileFingerprint fileFingerprint2) { FileFingerprintType min = fileFingerprint1.FileFingerprintType & fileFingerprint2.FileFingerprintType; if ((min & FileFingerprintType.All) == FileFingerprintType.None) { throw new ArgumentException("The fileFingerprint1.FileFingerprintType & fileFingerprint2.FileFingerprintType == FileFingerprintType.None"); } return(IsFileFingerprintSame(fileFingerprint1, fileFingerprint2, min)); }
private void FromFile(string path, FileFingerprintType fileFingerprintType) { this.fileFingerprintType = fileFingerprintType; if (fileFingerprintType == FileFingerprintType.None) { throw new ArgumentException("Can't be None.", "fileFingerprintType"); } FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan); bool moved = false; if (fileFingerprintType.HasFlag(FileFingerprintType.SHA1)) { sha1Code = sha1.ComputeHash(fileStream); moved = true; } else { sha1Code = null; } if (fileFingerprintType.HasFlag(FileFingerprintType.SHA256)) { if (moved) { fileStream.Seek(0, SeekOrigin.Begin); } else { moved = true; } sha256Code = sha256.ComputeHash(fileStream); } else { sha256Code = null; } if (fileFingerprintType.HasFlag(FileFingerprintType.MD5)) { if (moved) { fileStream.Seek(0, SeekOrigin.Begin); } md5Code = md5.ComputeHash(fileStream); } else { md5Code = null; } fileStream.Close(); }
public static FileFingerprint FromBase64(string base64) { byte[] data = Convert.FromBase64String(base64); byte[] typeBytes = new byte[2]; Array.Copy(data, 0, typeBytes, 0, 2); FileFingerprintType type = (FileFingerprintType)BitConverter.ToUInt16(typeBytes); byte[] sha1Code; byte[] sha256Code; byte[] md5Code; int i = 2; if (type.HasFlag(FileFingerprintType.SHA1)) { sha1Code = new byte[20]; Array.Copy(data, i, sha1Code, 0, 20); i += 20; } else { sha1Code = null; } if (type.HasFlag(FileFingerprintType.SHA256)) { sha256Code = new byte[32]; Array.Copy(data, i, sha256Code, 0, 32); i += 32; } else { sha256Code = null; } if (type.HasFlag(FileFingerprintType.MD5)) { md5Code = new byte[16]; Array.Copy(data, i, md5Code, 0, 16); } else { md5Code = null; } return(new FileFingerprint(sha1Code, sha256Code, md5Code)); }
public FileFingerprint(string path, FileFingerprintType fileFingerprintType = FileFingerprintType.All) { FromFile(path, fileFingerprintType); }
/// <remarks> /// 当没有共同的指纹类型是将抛出`ArgumentException`。 /// </remarks> public bool IsFileFingerprintSame(FileFingerprint fileFingerprint1, FileFingerprint fileFingerprint2, FileFingerprintType fileFingerprintType) { if (fileFingerprintType == FileFingerprintType.None) { throw new ArgumentException("Can't be FileFingerprintType.None.", "fileFingerprintType"); } if (fileFingerprintType.HasFlag(FileFingerprintType.SHA1)) { if (ComparerMethods.ComapreSameLengthByteArray(fileFingerprint1.sha1Code, fileFingerprint2.sha1Code) != 0) { return(false); } } if (fileFingerprintType.HasFlag(FileFingerprintType.SHA256)) { if (ComparerMethods.ComapreSameLengthByteArray(fileFingerprint1.sha256Code, fileFingerprint2.sha256Code) != 0) { return(false); } } if (fileFingerprintType.HasFlag(FileFingerprintType.MD5)) { if (ComparerMethods.ComapreSameLengthByteArray(fileFingerprint1.md5Code, fileFingerprint2.md5Code) != 0) { return(false); } } return(true); }
/// <summary> /// 用该指纹与另一个文件的指纹进行比较。 /// </summary> /// <param name="path">另一个文件的路径。</param> /// <param name="fileFingerprint">由另一个文件生成的指纹。</param> /// <param name="fileFingerprintType">比较的指纹类型。</param> public bool CheckFile(string path, out FileFingerprint fileFingerprint, FileFingerprintType fileFingerprintType) { fileFingerprint = new FileFingerprint(path); return(IsFileFingerprintSame(this, fileFingerprint, fileFingerprintType)); }