有什么办法让我知道文件是否已被修改

本文关键字:是否 修改 文件 我知道 什么 | 更新日期: 2023-09-27 18:31:03

我正在制作一个程序来检测文件是否已被修改。 但文件不是来自我。我想知道是否有可能知道我得到的文件是否已经被修改了。

有没有办法让我知道?我尝试了创建日期和修改日期,但有时当我修改文件时,它们的值会相同。

附言我没有原始文件。我想知道是否有可能在我得到它之前知道我得到的是否保持不变。

有什么办法让我知道文件是否已被修改

下面的示例

创建一个文件系统观察器来监视运行时指定的目录。该组件设置为监视 LastWrite 和 LastAccess 时间的变化,以及目录中文本文件的创建、删除或重命名。如果更改、创建或删除文件,则文件的路径将打印到控制台。重命名文件时,旧路径和新路径将打印到控制台。对于此示例,请使用系统诊断和 System.IO 命名空间。

using System;
using System.IO;
using System.Security.Permissions;
public class Watcher
{
    public static void Main()
    {
    Run();
    }
    [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    public static void Run()
    {
        string[] args = System.Environment.GetCommandLineArgs();
        // If a directory is not specified, exit program.
        if(args.Length != 2)
        {
            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }
        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = args[1];
        /* Watch for changes in LastAccess and LastWrite times, and
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = "*.txt";
        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);
        // Begin watching.
        watcher.EnableRaisingEvents = true;
        // Wait for the user to quit the program.
        Console.WriteLine("Press ''q'' to quit the sample.");
        while(Console.Read()!='q');
    }
    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
    }
    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }
}

参考:Microsoft MSDN

如果您想知道文件的内容是否更改请计算其哈希:

using System.IO;
using System.Security.Cryptography;
using (HashAlgorithmalgorithm = new .SHA512Managed())
{
    using (Stream fileStream = new FileStream(@"path", FileMode.Open))
    {
        byte[] hash = algorithm.ComputeHash(fileStream);
    }
}

在第一次运行时根据需要保留哈希,然后重新计算它并根据保存的值进行匹配。如果它们不同,则文件已更改。

我认为这个问题有几个问题,因为有多种方法可以回答这个问题。

1)如果问题是,"我收到了一个文件(以前不在计算机/网络/位置上),并想知道它是否被修改了......",那么答案是 - 不,因为你看到的只是一大块位,那么所有这些位都可以以发送者想要的任何方式进行修改和调整 - 时间戳, 文件状态指示器(例如,Windows 系统上的"存档"标记,或较新文件系统上的结构化元数据)或有关该文件的任何其他内容都可以设置为所需的内容。

2)如果问题是,"我有一个文件(在本地网络或文件系统上,我可以经常'戳'一次,或者在本地驱动器

上,我可以经常'戳'一次),我想知道它是否在我的应用程序运行之间被修改了",那么最简单的方法可能是存储该文件的计算哈希(如@Albireo回答的那样)。

3)如果问题是,"我有一个文件(在本地网络或文件系统上),我想知道它是否在我的应用程序运行之前被修改了",那么你正在查看一些可能不可能或不可能的东西,并且不可能以完全可靠的方式 - 对底层结构和您对该文件的期望有一些了解是必要的, 您最好更新您的问题,其中包含文件的组成以及您为什么要以编程方式查找更改的更多详细信息,以便我们可以确定执行此操作的最佳方法。