我们有一个完整路径的列表,我们要将一些文件复制到其中,有点像这样
C:\temp\sub1\file1A
C:\temp\sub1\file1B
C:\temp\sub2\file2A
C:\temp\sub3\file3A
C:\temp\sub3\file3B
C:\temp\sub3\file3C
etc....
有一些代码可以做到这一点
for each file in the file list
if (!Directory.Exists(dirName)
{
Directory.CreateDirectory(dirName)
}
我们可以从日志中看到所有子文件夹都已创建,并且每个子文件夹只进行了一次尝试 - 因此 Directory.Exists 在每个子文件夹中的第一个文件完成上述操作后返回 true循环。
然后代码会做类似的事情
var fileDownloadActions = new List<Action>();
// populated the list with GetFile(requiredInfo)
Parallel.Invoke(new ParallelOptions {MaxDegreeOfParallelism = 10},
fileDownloadActions.ToArray());
现在出现了奇怪的一点 - 大多数时候它工作得很好,但有时它会因多个 DirectoryNotFoundExceptions 而失败 - 声称它找不到刚刚创建的目录!
有时它找不到任何已创建的子文件夹,有时它适用于某些但不适用于其他文件夹。
当前的工作理论是,虽然创建文件夹的线程认为它们已创建(并且对 Directory.Exists 的检查返回 true,因为无论我们在文件夹中有多少文件,我们只尝试创建每个文件夹一次)它们实际上并没有在操作系统上正确地完全创建,当我们尝试从其他线程访问它们时,它会爆炸!
以前见过/听说过这样的事情吗?
我们的工作理论是否正确?如果正确,解决此问题的最佳方法是什么? (我宁愿不只是 sleep !)
最佳答案
这可以通过访问修改后的闭包来解释吗?
我猜这取决于你的循环看起来像什么,但从我所看到的情况来看,如果你存储委托(delegate)以供稍后执行,那么你有可能得不到你可能获得的 dirName 值期待。
看看http://www.yoda.arachsys.com/csharp/csharp2/delegates.html在 Captured variables 部分下。
关于c# - Directory.CreateDirectory 能否使一个文件夹可从一个线程访问但不能从其他线程访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16082056/