c# - 处理目录中的所有文件
问题描述
我需要处理目录中的所有现有文件,以及处理新文件。
在我的实现中,在处理所有文件和创建 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;
解决方案
通过创建已处理文件的列表,您可以在新文件到来时对其进行处理并避免重新处理,代码将如下所示:
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 方法应返回布尔值。
推荐阅读
- flutter - 为什么在颤振中从回调返回后会更新不同的地图实例?
- jsxgraph - 使用 jsxgraph 的 setjessiecode
- android - 如何从存储在 Cloud FireStore firebase 中的 URL 获取文件扩展名
- c# - 如何在gridview中创建启用禁用文本框
- python - 使用 Python 处理 \n vs ^M\n 换行符
- javascript - 无法在我的应用程序中集成 firebase 通知(javascript / angular)
- express-validator - 有没有办法检查 req.body 是否只包含一组参数
- javascript - Ajax 调用输出相同的消息
- c# - 使用 row_number 过滤视图以生成序列号
- android - Graphql 突变:调用后程序控制不会返回到 onResponse 或 onFailure