C#MD5哈希占用没有磁盘IO但正在产生哈希

时间:2014-07-07 20:30:00

标签: c# hash

我发现这很奇怪。我有一个实用工具,它将指向一个文件夹,使用相对路径/文件名/ filesize / md5哈希/其他一些东西索引该文件夹。如果md5哈希值不匹配,它会更新数据库中的哈希值,再次备份文件,然后继续使用其余文件。这主要是为了备份目的,但我也倾向于。

我第一次运行针对我的一些Web项目的程序时,它使用了磁盘IO和抓取文件句柄,这些都在Process Hacker中可见。但是,第二次运行它(如我关闭并重新启动它),它似乎没有占用任何磁盘IO,只是定期抓取一个句柄。然而,哈希正在出现。

迭代文件的代码:

        foreach (string path in paths)
        {
            try
            {
                string relativePath = path.Replace(@"Z:\99_Projects\web\de.com\", "");
                BackupFile backupFile = BackupFile.GetFile(relativePath, connection);
                string md5hash = "";
                long filesize = (new FileInfo(path)).Length;

                using (var file = File.OpenRead(path))
                {
                    md5hash = Hasher.ComputeMD5Hash(file);
                    //Console.WriteLine(md5hash);
                    if (backupFile == null)
                    {
                        BackupFile.NewBackupFile(relativePath, Path.GetFileName(path), md5hash, filesize, connection);
                    }
                    else
                    {
                        if (backupFile.md5 != md5hash)
                            backupFile.flags = CoreLib.Utils.Backup.Enums.BackupFileFlags.CHANGED;
                        else
                            backupFile.flags = CoreLib.Utils.Backup.Enums.BackupFileFlags.UNCHANGED;

                        backupFile.filesize = filesize;
                        backupFile.md5 = md5hash;
                        backupFile.Save(connection);
                    }

                    file.Close();
                }
            }
            catch (IOException e)
            {
                Console.WriteLine("Access: " + Path.GetFileName(path));
            }
            catch (SQLiteException e)
            {
                Console.WriteLine("|E|");
            }
            catch (Exception e)
            {
                Console.WriteLine("|EG|");
                throw e;
            }
        }

使用的Hasher类的代码,它实际上是加密MD5哈希计算器的一个小方法包装器,因此我可以在其他代码的其他地方重用它(以及其他哈希方法)。

public class Hasher
{
    public static string ComputeMD5Hash(Stream stream)
    {
        string hash = "";
        using (var md5 = System.Security.Cryptography.MD5.Create())
        {
            hash = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();                   
        }
        return hash;
    }
}

我尝试了几件事,包括调试应用程序并验证它实际上是在打开文件流和计算哈希值。我还把它打印到控制台的哈希,如计算所在的注释行所示,但即使它打印出来它也显示没有完全是磁盘IO。

1 个答案:

答案 0 :(得分:0)

嗯,看起来好像它的简单文件系统缓存与Process Hacker的轮询速度太慢,一旦缓存就无法接收它。我更改了一个文件,它检测到了更改,但根本没有显示可测量的磁盘IO(以字节为单位),所以我假设此时由于速度有多快而没有接收到它它正在发展。

相关问题