首页 > 解决方案 > 如何在没有进程锁定的情况下一次处理一堆文件

问题描述

我有以下每 30 秒运行一次的代码。通过 C# 计时器,

var sourceFiles = Directory.GetFiles(sourcePath, "*.zip").Select(f => new FileInfo(f));

                foreach (var sourceFile in sourceFiles)
                {
                    var success = await ProcessFileAsync(sourceFile);
                }

有时在sourcePath路径中我有大量文件,看起来它在 30 秒内没有完成,其他计时器开始了。因此,我经常收到文件正在使用错误,

该进程无法访问文件“D:\path\file1.Zip”,因为它正被另一个进程使用。

如何处理?请建议。

标签: c#

解决方案


我使用的一种常见模式是标记正在处理的文件,这样其他进程就不会尝试接触它们——如果您计划并行处理,这也很有用。

var sourceFiles = Directory.GetFiles("*.zip");
foreach (var sourceFile in sourceFiles)
{
    var tempFilename = sourceFile + ".processing";
    try  
    {
        if (File.Exists(sourceFile))
        {                  
             File.Move(sourceFile, tempFilename);
             var success = await ProcessFileAsync(sourceFile);
             if (success)
             {
                 File.Move(tempFilename, sourceFile + ".done");
             }
             else 
             {
                 File.Move(tempFilename, sourceFile);
             }
        }
    }
    catch 
    {
         // Rename the file back to be attempted later.
         File.Move(tempFilename, sourceFile);
    }
}

推荐阅读