我发现这很奇怪。我有一个实用工具,它将指向一个文件夹,使用相对路径/文件名/ 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。
答案 0 :(得分:0)
嗯,看起来好像它的简单文件系统缓存与Process Hacker的轮询速度太慢,一旦缓存就无法接收它。我更改了一个文件,它检测到了更改,但根本没有显示可测量的磁盘IO(以字节为单位),所以我假设此时由于速度有多快而没有接收到它它正在发展。