有什么方法让我知道文件是否被修改过?

时间:2016-01-19 13:04:16

标签: c# filesystems

我正在创建一个程序,用于检测文件是否已被修改。但文件不是来自我。我想知道是否可以知道我得到的文件是否已经修改过。

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

P.S。我没有原始文件。我想知道是否有可能知道我得到之前是否没有变化。

3 个答案:

答案 0 :(得分:1)

以下示例创建一个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);
    }
}

参考:Microsoft MSDN

答案 1 :(得分:1)

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

using System.IO;
using System.Security.Cryptography;

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

在第一次运行时保持哈希,然后重新计算它并将其与保存的值匹配。如果它们不同,则文件会更改。

答案 2 :(得分:0)

我认为这个问题存在一些问题,因为有多种方法可以回答这个问题。

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

2)如果问题是“我有一个文件(在本地网络或文件系统上,我可以经常'戳',或者在驱动器上本地,我可以'经常'戳')和我想知道它是否已经在我的应用程序运行的时间之间被修改了,然后可能最简单的方法是存储该文件的计算哈希值(由@Albireo回答)。

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