【问题标题】:Folder listener without using FilesystemWatcher不使用 FilesystemWatcher 的文件夹监听器
【发布时间】:2017-12-19 02:01:02
【问题描述】:

我需要在 C# 中创建一个侦听器,该侦听器将监视共享文件夹(UNC 路径)并在到达时将具有特定扩展名 (*.json) 的文件复制到目标文件夹。这些文件可以延迟大约半分钟。 文件夹永远不会为空。

问题:

  1. 文件将到达新的子文件夹,FileSystemWatcher 无法使用,因为它无法监听共享文件夹中的子文件夹。

  2. 文件需要复制并留在文件夹中,因此我们需要确保同一个文件不会被复制多次。

  3. 编辑/更新的文件需要再次复制并覆盖在目标文件夹中。

  4. 其他文件将在文件夹中,并且将到达我们需要忽略的新文件(没有正确的扩展名)。

我想过轮询文件夹,但我没有想出一个好的实现。

我很确定我不能使用 FilesystemWatcher 对象,但也许有人可以找到使用它的智能解决方案。

【问题讨论】:

  • 你见过thisthis
  • 我见过他们,但不喜欢这些解决方案。我正在寻找没有 FileSystemWatcher 的解决方案...
  • 如果没有FileSystemWatcher,轮询特定文件或新文件将是您唯一的选择。您需要找到一个对您的应用程序有足够响应性的速率,但又不足以使您的文件服务器和网络陷入瘫痪。

标签: c# listener polling filesystemwatcher


【解决方案1】:

解决您的问题的一个方法是,您可以在一段时间内不断检查位置并自行检查更改。

这不是一个完整的解决方案,而是一个需要考虑的想法。

    public async Task FindMyFile(string filePath)
    {           
        int retries = 0;
        this.Founded = false;
        while (!this.Founded)
        {
            if (System.IO.File.Exists(filePath))
                this.Founded = true;
            else if (retries < this.maxTries)
            {
                Console.WriteLine($"File {filePath} not found. Going to wait for 15 minutes");
                await Task.Delay(new TimeSpan(0, 15, 0));
                ++retries;
            }
            else
            {
                Console.WriteLine($"File {filePath} not found, retries exceeded.");
                break;
            }
        }
    }

【讨论】:

  • 这是一个很好的起点。不过,您可能需要考虑添加CancellationToken,以便可以根据需要取消等待。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2014-08-31
  • 2023-03-23
  • 2013-07-29
相关资源
最近更新 更多