首页 > 解决方案 > 处理目录中的所有文件

问题描述

我需要处理目录中的所有现有文件,以及处理新文件。

在我的实现中,在处理所有文件和创建 Watcher 之间,可能会出现一个未处理的新文件,如何解决?

            var dirPath = "myDir";
            while (true)
            {
                var alreadyExistFiles = Directory.EnumerateFiles(dirPath);
                if (alreadyExistFiles.Count() == 0)
                    break;
                foreach (var file in alreadyExistFiles)
                    Process(file);
            }
            var watcher = new FileSystemWatcher(dirPath);
            watcher.EnableRaisingEvents = true;
            watcher.Created += Watcher_Created;

标签: c#.netframeworks

解决方案


通过创建已处理文件的列表,您可以在新文件到来时对其进行处理并避免重新处理,代码将如下所示:

var watcherRoot = @"C:\File path goes here";

var processedFiles = new List<string>();

var watcher = new FileSystemWatcher(watcherRoot);
        
watcher.Created += (object sender, FileSystemEventArgs e) =>
{
    if (ProcessFile(e.FullPath))
    {
        processedFiles.Add(e.FullPath);
    }
};

watcher.EnableRaisingEvents = true;

foreach (var file in Directory.EnumerateFiles(watcherRoot))
{
    if (!processedFiles.Any(f => f == file))
    {
        ProcessFile(file);
    }
} 

如果处理时间很长并且您计划使用异步方法,我也会使用 CancellationToken。

ProcessFile 方法应返回布尔值。


推荐阅读