private static string CalculateFullHash(FileInformationItem file)
        {
            byte[] buffer = new byte[4 * 1024];
            byte[] runningHash = null;

            using (FileStream fs = new FileStream(file.FullPath, FileMode.Open))
            {

                int read = fs.Read(buffer, 0, buffer.Length);
                while (0 < read)
                {
                    runningHash = null == runningHash ? CalculateRawHash(buffer, 0, read) : CalculateRawHash(Merge(runningHash, buffer), 0, runningHash.Length + read);
                    read = fs.Read(buffer, 0, buffer.Length);
                }
            }

            return CalculateHash(buffer, 0, buffer.Length);
        }
 public static string CalculateHash(FileInformationItem file, HashMethod method)
 {
     if (HashMethod.Simple == method)
     {
         return CalculateSimpleHash(file);
     }
     else if (HashMethod.Lazy == method)
     {
         return CalculateLazyHash(file);
     }
     else if (HashMethod.Full == method)
     {
         return CalculateFullHash(file);
     }
     else
     {
         throw new ArgumentException();
     }
 }
        private static string CalculateLazyHash(FileInformationItem file)
        {
            try
            {
                byte[] buffer = new byte[1024 * 8];

                using (FileStream fs = new FileStream(file.FullPath, FileMode.Open))
                {
                    int read = fs.Read(buffer, 0, buffer.Length);

                    return CalculateHash(buffer, 0, read);
                }
            }
            catch (UnauthorizedAccessException)
            {
                return CalculateSimpleHash(file);
            }
            catch (IOException)
            {
                return CalculateSimpleHash(file);
            }
        }
 private static string CalculateSimpleHash(FileInformationItem file)
 {
     return CalculateHash(file.LastChange.ToString() + file.Size.ToString());
 }
        private static string GetSingleLine(FileInformationItem item)
        {
            List<string> fields = new List<string>();

            fields.Add(EscapeField(item.FileName));
            fields.Add(EscapeField(item.Extension));
            fields.Add(EscapeField(item.Hash));
            fields.Add(EscapeField(item.FullPath));
            fields.Add(EscapeField(item.Directory));
            fields.Add(EscapeField(item.Size.ToString()));
            fields.Add(EscapeField(item.Created.ToShortDateString()));
            fields.Add(EscapeField(item.LastChange.ToShortDateString()));
            fields.Add(EscapeField(item.LastOpen.ToShortDateString()));
            fields.Add(EscapeField(ResolveBoolean(item.Hidden).ToString()));
            fields.Add(EscapeField(ResolveBoolean(item.ReadOnly).ToString()));

            return string.Join(";", fields.ToArray());
        }
        private void Scan(DirectoryInfo root)
        {
            FileInfo[] files = null;
            try
            {
                files = root.GetFiles("*");
            }
            catch (UnauthorizedAccessException)
            {
                files = new FileInfo[0];
            }

            foreach (FileInfo file in files)
            {
                if (!this.shouldRun)
                {
                    return;
                }

                if ((file.Attributes & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint && (file.Attributes & FileAttributes.System) != FileAttributes.System)
                {
                    FileInformationItem item = new FileInformationItem(file);
                    item.Hash = HashFunctions.CalculateHash(item, this.hashMethod);
                    this.items.Add(item);
                }
            }

            DirectoryInfo[] directories = null;
            try
            {
                directories = root.GetDirectories();
            }
            catch (UnauthorizedAccessException)
            {
                directories = new DirectoryInfo[0];
            }

            foreach (DirectoryInfo newRoot in directories)
            {
                Scan(newRoot);
            }
        }