0

我有一些文件写入文件夹。首先写入 2 个文件,10-20 分钟后写入接下来的 2 个文件。

我的问题是:

有没有办法告诉文件系统观察者等到所有 4 个文件都在文件夹中后再执行我的代码?

4

1 回答 1

1

根据@BugFinder 的建议,我创建了类似但没有测试的东西。希望有用:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace CustomFileWatcher
{
    public class CustomFileWatcher : IDisposable
    {
        private FileSystemWatcher fileWatcher;
        private IList<string> fileList;
        private IList<string> createdFiles;

        public event EventHandler FilesCreated;
        protected void OnFilesCreated(EventArgs e)
        {
            var handler = FilesCreated;
            if (handler != null)
                handler(this, e);
        }

        public CustomFileWatcher(IList<string> waitForTheseFiles, string path)
        {
            fileList = waitForTheseFiles;
            createdFiles = new List<string>();
            fileWatcher = new FileSystemWatcher(path);
            fileWatcher.Created += fileWatcher_Created;
        }

        void fileWatcher_Created(object sender, FileSystemEventArgs e)
        {
            foreach (var item in fileList)
            {
                if (fileList.Contains(e.Name))
                {
                    if (!createdFiles.Contains(e.Name))
                    {
                        createdFiles.Add(e.Name);
                    }
                }
            }

            if (createdFiles.SequenceEqual(fileList))
                OnFilesCreated(new EventArgs());
        }

        public CustomFileWatcher(IList<string> waitForTheseFiles, string path, string filter)
        {
            fileList = waitForTheseFiles;
            createdFiles = new List<string>();
            fileWatcher = new FileSystemWatcher(path, filter);
            fileWatcher.Created += fileWatcher_Created;
        }

        public void Dispose()
        {
            if (fileWatcher != null)
                fileWatcher.Dispose();
        }
    }
}

用法

class Program
    {
        static void Main(string[] args)
        {
            IList<string> waitForAllTheseFilesToBeCopied = new List<string>();
            waitForAllTheseFilesToBeCopied.Add("File1.txt");
            waitForAllTheseFilesToBeCopied.Add("File2.txt");
            waitForAllTheseFilesToBeCopied.Add("File3.txt");

            string watchPath = @"C:\OutputFolder\";

            CustomFileWatcher customWatcher = new CustomFileWatcher(waitForAllTheseFilesToBeCopied, watchPath);

            customWatcher.FilesCreated += customWatcher_FilesCreated;
        }

        static void customWatcher_FilesCreated(object sender, EventArgs e)
        {
            // All files created.
        }
    }
于 2016-10-20T08:10:47.780 回答