【问题标题】:Read files based on their modified time in C#根据 C# 中的修改时间读取文件
【发布时间】:2014-12-03 06:38:22
【问题描述】:

我这里有个情况。我想根据上次修改时间的创建来读取文件。最初我使用 FileSystemWatcher 以便在新文件到来时收到通知,但后来我意识到如果运行我的软件的系统出现故障或重新启动文件被删除的位置仍然会继续。

为了便于理解,我举个例子:

系统 A - 文件服务器(文件每 2 分钟在此服务器上的目录中创建一次) 系统 B - 我的软件将从系统 A 的路径运行和监控文件

如果系统 B 重新启动并在 10 分钟后再次启动,FileSystemWatcher 将跳过这 10 分钟内生成的所有这些文件。

如何确保这 10 分钟内生成的文件也被捕获?

如果我的问题仍然无法理解,请告诉我。

【问题讨论】:

  • 我想没有办法,一种方法是在系统重启时再次读取文件......

标签: c# file directory filesystemwatcher


【解决方案1】:

如果您不想将其拆分为两个系统,则必须保留一些信息。 每次在文件系统观察程序上触发新事件时,您都可以将当前时间戳存储在文件中。每次您的服务启动时,您都可以从文件系统中读取比上一个时间戳更新的所有文件。这样您就不会错过任何文件。

【讨论】:

  • 这正是我也在考虑的。但是你能帮忙提供一个示例代码吗?
【解决方案2】:

我会将这个应用程序分成两部分并运行一个 filesystemwatcher-wcf 服务来缓冲这 10 分钟内创建的文件,并在系统 b 重新启动时将其发送到系统 b。我看不到其他方式,抱歉。

【讨论】:

    【解决方案3】:

    我认为 FileSystemWatcher 必须将有关文件系统的信息写入 DB(或其他类型的存储)。当系统 B 启动时,观察者将当前文件系统与此信息进行比较,并将引发有关更改的事件。

    【讨论】:

    • 这正是我也在考虑的。但是你能帮忙提供一个示例代码吗?
    【解决方案4】:

    从源机器复制整个文件并根据条件粘贴到目标位置..

    字符串 dirPath = @"C:\A"; 字符串 DestinPath = @"C:\B";

            if (Directory.Exists(dirPath) && Directory.Exists(DestinPath))
            {
                DirectoryInfo di = new DirectoryInfo(dirPath);
    
                foreach (var file in di.GetFiles())
                {
                    string destinFile = DestinPath + "\\" + file.Name;
                    if (File.Exists(destinFile))
                    {
                        continue;
                    }
                    else
                        file.CopyTo(destinFile);
                }
    
            }
    

    【讨论】:

      【解决方案5】:

      不确定我是否正确理解了您的问题,但根据我得到的信息并假设两个系统在时间上是同步的,例如,如果您想获取在十分钟内修改过的文件:

              DateTime tenMinutesAgo = DateTime.Now.AddMinutes(-10);
              string[] systemAFiles = System.IO.Directory.GetFiles(systemAPath);
              foreach (string files in systemAFiles)
              {
                  DateTime lastWriteTime = System.IO.File.GetLastWriteTime(files);
                  if (lastWriteTime > tenMinutesAgo) //produced after ten minutes ago
                  {
                      //read file
                  }
              }
      

      我了解这些文件是“生成的”,因此它们已被创建或修改。如果它们只是从一个文件夹移动到另一个文件夹,这是行不通的。在这种情况下,最好的方法是写入该列表中文件的快照(并将其写入某种保存文件)并在再次运行时进行比较。

      【讨论】:

      • 是的。可能有些类似于这个。连同@Marc 和 Vitone 的想法,我可以实现这段代码。让我试着回复你。
      猜你喜欢
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多