1

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

4

6 回答 6

11

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

于 2009-01-26T08:30:16.660 回答
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);
        }
}
于 2009-01-26T09:13:15.823 回答
3

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

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

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

于 2009-01-26T08:36:41.780 回答
3

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

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

于 2009-01-26T09:35:59.490 回答
1

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

于 2009-05-13T22:00:04.047 回答
0

您必须记下要检查的文件的修改日期。一段时间后,您可以检查文件是否稍后被修改。如果文件被修改为不同的日期和时间,您可以制作副本。

于 2013-11-15T10:21:28.443 回答