我有以下一段代码,每 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);
}
}