在尝试获取文件所有权时遇到 System.InvalidOperationException: '集合已修改'
错误,通常是因为在遍历集合的过程中修改了集合的内容。这种情况在多线程环境下尤为常见,但也可能发生在单线程环境中。
为了避免 System.InvalidOperationException
异常,可以采取以下几种方法:
ToList()
或 ToArray()
在遍历集合之前,先将集合转换为列表或数组,这样就不会在遍历过程中修改原始集合。
var files = Directory.GetFiles(@"C:\path\to\directory");
var fileNames = files.ToList(); // 或者 var fileNames = files.ToArray();
foreach (var fileName in fileNames)
{
// 处理文件
}
foreach
循环时避免修改集合确保在 foreach
循环中不修改集合的内容。
var files = Directory.GetFiles(@"C:\path\to\directory");
var fileNames = new List<string>(files);
foreach (var fileName in fileNames)
{
// 处理文件
if (/* 某些条件 */)
{
fileNames.Remove(fileName); // 这样会抛出异常
}
}
可以使用 for
循环来避免这个问题:
var files = Directory.GetFiles(@"C:\path\to\directory");
var fileNames = new List<string>(files);
for (int i = 0; i < fileNames.Count; i++)
{
var fileName = fileNames[i];
// 处理文件
if (/* 某些条件 */)
{
fileNames.RemoveAt(i);
i--; // 调整索引
}
}
ConcurrentBag
或 ConcurrentQueue
在多线程环境中,可以使用线程安全的集合类,如 ConcurrentBag
或 ConcurrentQueue
。
var files = new ConcurrentBag<string>(Directory.GetFiles(@"C:\path\to\directory"));
foreach (var fileName in files)
{
// 处理文件
}
通过以上方法,可以有效避免 System.InvalidOperationException
异常,确保文件所有权获取过程的稳定性和安全性。
领取专属 10元无门槛券
手把手带您无忧上云