Beispiel #1
0
        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;
        }
Beispiel #2
0
        /// <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));
        }
Beispiel #3
0
        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();
        }
Beispiel #4
0
        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));
        }
Beispiel #5
0
 public FileFingerprint(string path, FileFingerprintType fileFingerprintType = FileFingerprintType.All)
 {
     FromFile(path, fileFingerprintType);
 }
Beispiel #6
0
        /// <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);
        }
Beispiel #7
0
 /// <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));
 }