检测两个文件是否完全相同,比较什么?

发布于 2024-10-15 04:41:47 字数 211 浏览 2 评论 0原文

我想知道如何比较两个文件以确定它们是否完全相同。 我知道如何比较文件名、创建/修改日期,甚至如果需要的话还可以比较哈希值。

但是我不知道如何比较文件上的元数据(我实际上不知道它是如何存储的):安全配置、兼容性设置、潜在的防病毒时间戳等等。

我的最终目标是深入比较不同计算机上的两个文件系统,

谢谢 史蒂夫

[编辑]为了澄清我重新表述了问题的标题

I'd like to know how to compare two files to determine if it is exactly the same one.
I know how to compare filename, date of creation/modification and even hash if required.

However I don't know how to compare meta data on the file (I actually don't know how it is stored) : security configuration, compatibility settings, potential antivirus timestamp and so on.

my final goal is to deep compare two file systems on separate computers

thanks
steve

[edit] in order to clarify I reformulate the title of the question

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

把昨日还给我 2024-10-22 04:41:47

文件由什么构成?在现代文件系统(例如 NTFS)上,您有

  • 文件属性(时间、FAT 属性)、
  • 未命名文件流、
  • 零个或多个备用数据流(ADS)、
  • 扩展属性
  • NTFS 安全性(它存储在 ADS 中,但我们可以单独识别它)、

其余的(配置、防病毒时间戳/这是什么/等)存储在文件外部,而不是文件。

因此,您需要检查文件的上述部分并进行比较。

存在不同的方法来读取不同的信息,您需要使用所有这些方法将它们组合在一起并对不同的文件进行比较。

What constitutes a file? On modern filesystem (say NTFS) you have

  • file atttibutes (times, FAT attributes)
  • unnamed file stream
  • zero or more alternate data streams (ADS)
  • Extended Attributes
  • NTFS security (it's stored in ADS yet we can identify it separately)

The rest (configuration, antivirus timestamp /what's this/ etc) is stored outside of the file and is not the file.

So you need to check the above mentioned bits of the file and compare them.

Different methods exist for reading different bits of information and you need to use them all to get all them together and compare them for different files.

樱娆 2024-10-22 04:41:47

只需完成 System.IO.File 上的所有 getter 即可。

GetAccessControl
GetAttributes
GetCreationTime
...
ReadAllBytes

如果您对“同一文件”的定义依赖于其他任何内容(例如在不同计算机上的绝对路径),那么也请获取它,但您还没有明确那是什么。

Just work through all the getters on System.IO.File.

GetAccessControl
GetAttributes
GetCreationTime
...
ReadAllBytes

If there's anything else that your definition of "same file" depends on (like the absolute path if on different machines), then get that as well, but you haven't made clear what that is.

温柔一刀 2024-10-22 04:41:47

您需要对两个文件进行 MD5、SHA 哈希,并比较两者是否具有相同的总和。

检查 System.Security.Cryptography 中的 MD5CryptoServiceProvider 和 SHA512CryptoServiceProvider。

它是这样的:

private string ComputeHashAsText(byte[] fileBytes)
{
    using (SHA512CryptoServiceProvider cryptoService = new SHA512CryptoServiceProvider())
    {
        return Encoding.ASCII.GetString(cryptoService.ComputeHash(fileBytes));
    }
}

public bool CompareFiles(string pathA, string pathB)
{
    string hashPathA = ComputeHashAsText(File.ReadAllBytes(pathA));
    string hashPathB = ComputeHashAsText(File.ReadAllBytes(pathB));

    return hashPathA == hashPathB;
}

在实际的解决方案中,您可能希望以块或类似的方式计算哈希值,因为要比较的文件可能太大,无法将所有字节读取到内存并对它们进行哈希处理。

You need to MD5, SHA hash both files and compare if both have the same sum.

Check the MD5CryptoServiceProvider and SHA512CryptoServiceProvider in System.Security.Cryptography.

It's something like this:

private string ComputeHashAsText(byte[] fileBytes)
{
    using (SHA512CryptoServiceProvider cryptoService = new SHA512CryptoServiceProvider())
    {
        return Encoding.ASCII.GetString(cryptoService.ComputeHash(fileBytes));
    }
}

public bool CompareFiles(string pathA, string pathB)
{
    string hashPathA = ComputeHashAsText(File.ReadAllBytes(pathA));
    string hashPathB = ComputeHashAsText(File.ReadAllBytes(pathB));

    return hashPathA == hashPathB;
}

In an actual solution you may want to compute the hash in chunks or something like this, because maybe files to compare are too big to read all bytes to memory and hash them.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文