在您将此问题标记为重复之前,请阅读我写的内容。我已经在很多页面上检查了许多问题以寻求解决方案,但找不到任何东西。在我当前的应用程序中,我正在使用以下代码:
using (var md5 = MD5.Create())
{
using (FileStream stream = File.OpenRead(FilePath))
{
var hash = md5.ComputeHash(stream);
var cc = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
Console.WriteLine("Unique ID : " + cc);
}
}
Run Code Online (Sandbox Code Playgroud)
对于小型文件,这对我来说已经足够好了,但是一旦我尝试使用大文件,就花了大约30-60秒的时间来获取文件ID。
我想知道是否有其他方法可以通过使用或不使用哈希或流从文件中获得独特的东西?我的目标机器不是一直都是NTFS或Windows,因此我不得不寻找另一种方法。
我想知道是否仅从流中获取第一个“ x”个字节并使用该较小尺寸的流对唯一ID进行哈希处理是否有意义?
编辑:这不是为了安全或其他事情,我需要这个唯一的ID,因为FileSystemWatcher无法正常工作:)
EDIT2:基于评论,我决定更新我的问题。我之所以这样做,可能是因为存在一个不基于为文件创建唯一ID的解决方案的原因。我的问题是我必须观看文件夹并在发生事件时触发事件;A)新添加的文件B)更改的文件C)删除的文件
我不能使用FileSystemWatcher的原因是不可靠。有时我将100x文件放到该文件夹中,而FileSystemWatcher仅触发20x-30x事件,如果它是网络驱动器,则有时可能会更低。我的方法是将所有文件及其唯一ID保存到文本文件中,并每5秒检查索引文件是否有任何更改。如果没有像18GB这样的大文件,它就可以正常工作。.但是计算40GB文件的哈希值花费的时间太长了。.我的问题是:当我正在观看的文件夹发生问题时,如何触发事件
EDIT3:设置赏金后,我意识到我需要提供有关代码中发生的事情的更多信息。首先,这是我对用户@JustShadow的回答(时间太长,因此我无法将其发送为评论)我将解释如何做到这一点,我将filepath-uniqueID(MD5哈希值)保存在文本文件中,每隔5秒检查一次Directory.GetFiles(DirectoryPath)的文件夹;然后我将第一个列表与5秒钟前的列表进行比较,这样我得到2个列表
List<string> AddedList = FilesInFolder.Where(x => !OldList.Contains(x)).ToList();
List<string> RemovedList = OldList.Where(x => !FilesInFolder.Contains(x)).ToList();
Run Code Online (Sandbox Code Playgroud)
这就是我得到它们的方式。现在我有了if块
if (AddedList.Count > 0 && RemovedList.Count == 0)
那很好,不重命名新文件。我哈希所有新文件并将其添加到我的文本文件中。
if (AddedList.Count == 0 && RemovedList.Count > 0)
Run Code Online (Sandbox Code Playgroud)
首先,如果还是不错的话,只有被删除的项目相反,我将其从文本文件中删除并完成。在这种情况下,出现了我的else块..这是我进行比较的地方,基本上,我对所有添加和删除的列表项进行哈希处理,然后将两个列表中都存在的项进行哈希处理,例如在此将a.txt重命名为b.txt如果我的列表的两个计数都将大于零,那么将被触发。在其他内部,我已经知道一个哈希值(它在我5秒钟前创建的文本文件中),现在我将其与所有AddedList元素进行比较,看看是否可以匹配它们,如果没有匹配项,那就是重命名情况匹配,那么我可以说自上次扫描以来b.txt确实已被新添加到列表中。我还将提供一些我的类代码,因此也许有办法解决这个难题。
现在,我还将分享一些我的类代码,也许当每个人都知道我在做什么时,我们可以找到一种解决方法。这是我的计时器的样子
private void TestTmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lock (locker)
{ …Run Code Online (Sandbox Code Playgroud) c# ×1