asp.net 是否有一个“文件夹指纹”来检测文件夹的内容是否在两个时间点之间发生了变化?无法使用FileSystemWatcher

nx7onnlm  于 12个月前  发布在  .NET
关注(0)|答案(2)|浏览(112)

我正在寻找最快的方法(在C#/ASP.NET中)来检测文件夹中的任何内容是否在两个时间点之间发生了变化。我不需要知道文件、总大小或有关文件夹的任何其他信息。我只想知道有没有什么变化。
因为我不能访问运行这种文件夹更改检测方法的外部作用域,所以我不能使用FileSystemWatcher,它必须在不再需要时被丢弃(它实现了IDisposable,由于我所需要的架构,我无法以实际的方式使用它)。
如果有某种“文件夹指纹”,如果文件夹的内容发生变化,它会发生变化,这将是理想的。然后,我可以将最后一个指纹与当前指纹进行比较,如果两个指纹不同,则返回true,表明文件夹中发生了变化。
理想情况下,它的工作方式与Assembly.GetEntryAssembly().ManifestModule.ModuleVersionId返回的值完全相同,它为您提供了应用程序当前构建的“指纹”,然后允许您检测应用程序是否在两个时间点之间重新编译。
大概是这样的:

注意:System.IO.GetFolderFingerprint()是虚构的方法。

public static class FolderChangeChecker
{
    private const string _path = "c:/path/to/folder";    
    private static Guid _originalFingerprint = System.IO.GetFolderFingerprint(_path);    
    public static bool FolderHasChanged()
    {    
        return System.IO.GetFolderFingerprint(_path) != _originalFingerprint;
    }
}

请让我知道是否有一种方法可以快速做到这一点。

myzjeezk

myzjeezk1#

你可以枚举目录中的文件,并建立一个由文件名、长度、LastWriteTimeUtc.ticks组成的大字符串,然后创建一个哈希。

fileStringSb = new StringBuilder();

foreach (var file in files)
{
    var fileInfo = new FileInfo(file);

    fileStringSb .Append(fileInfo.Name);
    fileStringSb .Append(fileInfo.Length.ToString());
    fileStringSb .Append(fileInfo.LastWriteTimeUtc.Ticks.ToString());
}

using (var md5 = System.Security.Cryptography.MD5.Create())
{
    byte[] filesHash = fingerPrint = md5.ComputeHash(Encoding.UTF8.GetBytes(fileStringSb.ToString());
}
pbwdgjma

pbwdgjma2#

高级日志记录IIS允许您记录甚至文件系统事件,然后您可以筛选advance logging IIS的日志文件

相关问题