如何在没有进程锁定的情况下一次处理一堆文件



我有以下一段代码,每 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",因为它正被另一个进程使用。

如何处理这个问题?请指教。

  • 每 30 秒。我可以一次处理 1 个文件,但由于文件数量很大,它会减慢进程。
  • 我不知道在 1 个文件过程中消耗了多少时间。

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

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);
    }
}

最新更新