gpt4 book ai didi

c# - Directory.CreateDirectory 能否使一个文件夹可从一个线程访问但不能从其他线程访问?

转载 作者:太空宇宙 更新时间:2023-11-03 16:14:40 25 4
gpt4 key购买 nike

我们有一个完整路径的列表,我们要将一些文件复制到其中,有点像这样

 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.htmlCaptured variables 部分下。

关于c# - Directory.CreateDirectory 能否使一个文件夹可从一个线程访问但不能从其他线程访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16082056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com