C# 使用.NET定期查找目录中已更改的文件

C# 使用.NET定期查找目录中已更改的文件,c#,.net,.net-4.0,C#,.net,.net 4.0,我正试图找到最可靠的方法,使用C#和.NET在目录中查找新的和修改过的文件。我不是在寻找一个实时解决方案,我想在给定的时间检查更改。可以是每5分钟或每小时等 FileInfo对象上有CreationTime和LastWriteTime,这似乎足以获取新的和修改的文件。但是,如果文件被重命名,则所有可用日期都不会更改,如果我们只查看CreationTime和LastWriteTime,则文件将丢失 目前,我正在维护目录中文件的af“快照”,包括上次检查更改的时间。这使我能够将目录中的所有文件与快照

我正试图找到最可靠的方法,使用C#和.NET在目录中查找新的和修改过的文件。我不是在寻找一个实时解决方案,我想在给定的时间检查更改。可以是每5分钟或每小时等

FileInfo对象上有CreationTime和LastWriteTime,这似乎足以获取新的和修改的文件。但是,如果文件被重命名,则所有可用日期都不会更改,如果我们只查看CreationTime和LastWriteTime,则文件将丢失

目前,我正在维护目录中文件的af“快照”,包括上次检查更改的时间。这使我能够将目录中的所有文件与快照中的文件进行比较,如果快照缺少一个文件,则该文件是新的或重命名的

这是唯一的办法吗?我错过了什么。我不打算使用FileSystemWatcher,因为它看起来很“有缺陷”,并且需要一直运行

欢迎提出任何建议

圣诞快乐

具有用于的组件

该框架涵盖所有数据类型和数据存储,文件系统组件应该比FileSystemWatcher更可靠。正如MSDN中所说:

它可用于同步NTFS、FAT或SMB文件系统中的文件和文件夹。要同步的目录可以是本地或远程目录;它们不必具有相同的文件系统。应用程序可以通过显式列出文件或使用通配符(如*.txt)使用静态过滤器排除或包含文件。或者应用程序可以设置排除整个子文件夹的筛选器。应用程序还可以注册以接收文件同步进度通知


我知道您确实只想知道文件何时更改,但考虑到您已经取消了
FileSystemWatcher
路由,它可能是唯一可靠的路由(除了您自己维护快照的工作之外)。

使用该类,这是一个好方法。也许你可以更具体地说

因为它看起来很“车”


编辑:FileSystemWatcher确实支持。

一种非常原始的方法是使用“dir”命令并比较输出

以下是有关参数的一些信息:


与日期快照一起,您可以比较目录的输出。。。它的速度非常快,资源消耗也非常低……

您的问题看起来非常像一个没有主键的数据库

如果您为该文件夹中的每个文件分配一个GUID,并检查该GUID而不是文件名,那么您的应用程序将更加可靠

这就是理论,在实践中,我们讨论的是元数据。根据您的系统和文件夹中包含的文件,您可以使用

这是一个非常重要的问题

归根结底,它包含一个文件中没有存储的信息,而只是与之链接。
然后,您可以在DOS框中查找:

notepade.exe myfile.txt:MYGUID
它要求系统使用NTFS


.net中的文件系统监视程序类提供了两种方法:-

  • 一旦改变
  • 重新命名

  • 您可以将EnableRaisingEvents设置为true,即!!!!每件事都很简单,有了点网络寒意

    OP特别提到他不需要实时,也不想使用FileSystemWatcher类。然而,如果你认为他应该这样做,那么你需要解释为什么它会解决这个问题。它正在等待事件的发生。启动FileSystemWatcher时,它会要求Windows操作系统了解指定文件或目录上的文件事件。当文件操作发生时,Windows会检查您指定的文件模式,如果存在匹配,则会引发FileSystemWatcher事件。这是正确的方法。关于它有缺陷的评论可能源于对该类缺乏经验。FileSystemWatcher在某些情况下可能看起来“有缺陷”。我使用它在应用程序之间进行通信。一个应用程序将信息写入一个文件。另一个读取文件并将其删除。问题是,文件创建事件发生在第一个应用程序完成写入文件之前。解决方案是监听“重命名”事件。第一个应用程序用一个临时名称写入文件,当完成时,将文件重命名为它的最终名称。谢谢克里斯,我确实考虑了同步框架,但是如果我没有错的话,它需要是一对文件夹,对吧?我只是在寻找一种检测变化的方法。这是否可能使用同步框架?@ChristianSparre-Hmm,不确定。我必须承认,我只在需要两个副本的情况下使用过它来同步数据库。这似乎是关于同步文件(传播更改),而不是跟踪更改发生的时间。@codesparkle-我知道,但如果
    FileSystemWatcher
    路由无法处理,这可能是唯一可靠的方法来自同步框架的“FileSyncProvider”能够检测到文件,但是它需要在某个地方“放置”更改,否则它将重复检测相同的文件。我将尝试看看是否可以创建“虚拟文件”“提供者:)老实说,我认为你基本上已经在用正确的方式做这件事了。:)<代码>FileSystemWatcher是事件驱动的。它不会调查你是否在想这个。