【问题标题】:How can I tell if a file has changed through .NET?如何判断文件是否已通过 .NET 更改?
【发布时间】:2010-10-03 12:11:29
【问题描述】:

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

【问题讨论】:

    标签: .net file io


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 他们想要一个 .Net 解决方案。这可以在自动启动的服务或自动启动的系统托盘应用程序等中实现。由 OP 进一步研究,但这将使他们启动。
        【解决方案4】:
        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);
                }
        }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 查看 MSDN 文档,根据您尝试观看的文件数量,可能存在内存泄漏和/或内存不足异常。仍然来自 .net 最好的方法是 ck 的回答。
          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2015-04-17
            • 2016-10-15
            • 1970-01-01
            • 2017-11-04
            • 2020-09-21
            • 2011-10-12
            • 2011-06-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多