如何通过.NET判断文件是否已更改?

时间:2009-01-26 08:29:07

标签: .net file io

我正在寻找一种通过.NET确定特定文件何时发生变化的方法。 (我最终想要的是在文件发生变化后立即复制文件的功能。)如何做到这一点?

6 个答案:

答案 0 :(得分:11)

您可以使用FileSystemWatcher对象。这会引发指定监视文件夹中文件更改的事件。

答案 1 :(得分:5)

class Program
    {
        static void Main(string[] args)
        {
            FileSystemWatcher fsw = new FileSystemWatcher(@"c:\temp");
            fsw.Changed += new FileSystemEventHandler(fsw_Changed);
            fsw.Deleted += new FileSystemEventHandler(fsw_Deleted);
            fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
            fsw.Created += new FileSystemEventHandler(fsw_Created);
            fsw.EnableRaisingEvents = true;
            Console.ReadLine();
        }

        static void fsw_Created(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was created", e.FullPath);
        }

        static void fsw_Renamed(object sender, RenamedEventArgs e)
        {
            Console.WriteLine("{0} was Renamed", e.FullPath);
        }

        static void fsw_Deleted(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was Deleted", e.FullPath);
        }

        static void fsw_Changed(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was Changed", e.FullPath);
        }
}

答案 2 :(得分:3)

Microsoft Windows及其最终祖先MS-DOS始终在其文件上有一个属性,指示自上次清除该属性后该文件是否已更改,这是一种“脏标志”。过去,备份程序使用它来查找需要逐步备份的文件,然后在创建该文件的副本时将其清除。

您可以使用File.GetAttributes获取文件的属性,并使用File.SetAttributes清除“Archive”属性。下次打开该文件进行写入时,将再次设置该存档标志。

请注意复制已更改的文件,因为这些文件可能仍处于打开状态。您可能希望通过在复制时将它们打开以进行读取来避免并发问题,如果失败则您知道该文件仍然可以写入。

答案 3 :(得分:3)

对于所有回复的人,使用FileSystemWatcher,您如何处理应用未运行的时间?例如,用户重新启动了该框,修改了您感兴趣的文件,然后启动了您的应用程序?

请务必仔细阅读FileSystemWatcher Class上的文档,特别是有关事件和缓冲区大小的部分。

答案 4 :(得分:1)

你可能会遇到FileSystemWatcher的问题(没有获取事件,太多事件等)。这段代码将其包装起来并解决其中许多问题: http://precisionsoftware.blogspot.com/2009/05/filesystemwatcher-done-right.html

答案 5 :(得分:0)

您必须记下要检查的文件的修改日期。 在一段时间后,您可以检查文件是否稍后被修改。 如果使用不同的日期和时间修改文件,则可以进行复制。