C# 有没有办法让我知道一个文件是否被修改过?

C# 有没有办法让我知道一个文件是否被修改过?,c#,filesystems,C#,Filesystems,我正在制作一个程序,检测文件是否被修改。但文件不是我写的。我想知道是否有可能知道我得到的文件是否已经被修改过 有什么办法让我知道吗?我尝试过创建日期和修改日期,但有时当我修改文件时,它们的值将是相同的 另外,我没有原始档案。我想知道是否有可能在我得到它之前知道我得到的数据是否没有改变 下面的示例创建一个FileSystemWatcher来监视运行时指定的目录。该组件设置为监视LastWrite和LastAccess时间的更改,以及目录中文本文件的创建、删除或重命名。如果文件被更改、创建或删除,文

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

有什么办法让我知道吗?我尝试过创建日期和修改日期,但有时当我修改文件时,它们的值将是相同的


另外,我没有原始档案。我想知道是否有可能在我得到它之前知道我得到的数据是否没有改变

下面的示例创建一个FileSystemWatcher来监视运行时指定的目录。该组件设置为监视LastWrite和LastAccess时间的更改,以及目录中文本文件的创建、删除或重命名。如果文件被更改、创建或删除,文件的路径将打印到控制台。重命名文件时,旧路径和新路径将打印到控制台。 本例使用System.Diagnostics和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);
    }
}
参考:

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

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) 如果问题是,“我有一个文件(在本地网络或文件系统上),我想知道它是否在运行我的应用程序之前被修改过”,那么你看到的可能是,也可能不是,并且不可能以完全可靠的方式实现-有必要了解底层结构以及您在该文件中所期望的内容,您最好更新您的问题,提供更多关于文件组成的详细信息,以及为什么要以编程方式查找更改,以便我们确定执行此操作的最佳方式。

如果您需要知道文件内容是否已更改,请执行哈希比较。据我所知,FileSystemWatcher在我的程序运行时监视文件是否被修改。但是我需要的是在我得到文件之前知道它是否被修改过。谢谢你说的文件在我拿到之前已经修改过了?它是通过网络接收的还是从其他应用程序接收的?我的程序不是设计为一直运行的,但在我得到它之前,我想知道文件是否已被修改/更改。我没有原始文件,因此无法比较它们的哈希值。这可能吗+1.请参阅本手册,以备将来参考。谢谢。:)您可以保存该文件的副本。因此,当你运行你的程序时,你会比较副本和刚打开的文件的内容。示例:log.txt和lastLog.txt-每次读取log.txt时都会创建lastLog.txt。下次打开log.txt时,请将内容与lastLog.txt(最后一个内容是log.txt)进行比较。谢谢。我不是以英语为母语的人。很抱歉但是是的,第一条完全描述了我的问题。谢谢你的回答。没问题,很高兴我能帮你解决问题:-)