C# System.IO.Compression.ZipArchive是否在处置后锁定文件?

C# System.IO.Compression.ZipArchive是否在处置后锁定文件?,c#,zip,system.io.compression,C#,Zip,System.io.compression,我有一个类,它从多个源获取数据并将它们写入ZIP文件。我已经对类进行了基准测试,以检查是否使用了CompressionLevel。Optimal将比CompressionLevel慢得多。faster。但每次运行基准测试时,基准测试都会在不同的迭代和不同的压缩级别值上抛出异常 我开始一步一步地删除添加文件内容的方法,直到我得到下面的代码(在for循环中),除了创建一个空的zip文件并删除它之外,它基本上什么都不做 简化代码: var o=@“e:\test.zip”; var结果=新文件信息(o

我有一个类,它从多个源获取数据并将它们写入ZIP文件。我已经对类进行了基准测试,以检查是否使用了
CompressionLevel。Optimal
将比
CompressionLevel慢得多。faster
。但每次运行基准测试时,基准测试都会在不同的迭代和不同的压缩级别值上抛出异常

我开始一步一步地删除添加文件内容的方法,直到我得到下面的代码(在for循环中),除了创建一个空的zip文件并删除它之外,它基本上什么都不做

简化代码:

var o=@“e:\test.zip”;
var结果=新文件信息(o);
对于(变量i=0;i<1\u 000\u 000;i++)
{
//替代方法
//使用(var archive=ZipFile.Open(o,ZipArchiveMode.Create))
使用(var archive=new ZipArchive(result.OpenWrite(),ZipArchiveMode.Create,false,Encoding.UTF8))
{
}
result.Delete();
}
循环在我的PC上运行大约100到15k次迭代,然后在尝试删除文件时抛出IOException,表示文件(
result
)已锁定

所以。。。我是否错过了有关如何使用
System.IO.Compression.ZipArchive
的内容?ZipArchive没有关闭方法,使用应处置/关闭存档。。。我尝试了不同的.NET版本4.6、4.6.1、4.7和4.7.2

编辑1:
result.Delete()
不是经过基准测试的代码的一部分

编辑2:
还尝试在使用块后使用
Thread.Sleep(5/10/20)
(因此使用
result.Delete()
检查锁定是否仍然存在),但在最长20毫秒内,文件仍会在某个点锁定。没有尝试高于20ms的值

编辑3:
不能在家里责备这个问题。在工作中尝试了十几次,循环从未达到20k次迭代。在这里试过一次就完成了

编辑4:

jdweng(见评论)是对的谢谢它与我在本地硬盘上的“e:”分区有关。同样的代码可以在本地ssd上的“c:”分区和网络共享上正常运行。

在我的经验中,当流的dispose方法返回时,文件可能无法始终解锁。我最好的猜测是,这是由于文件系统异步执行某些操作造成的。我找到的最佳解决方案是多次重试删除操作。i、 例如:

    public static void DeleteRetrying(this FileInfo self, int delayMs = 100, int numberOfAttempts = 3)
    {
        for (int i = 0; i < numberOfAttempts-1; i++)
        {
            try
            {
                self.Delete();
            }
            catch (IOException)
            {
                // Consider making the method async and
                // replace this with Task.Delay
                Thread.Sleep(delayMs);
            }
        }
        // Final attempt, let the exception propagate
        self.Delete();
    }
public static void DeleteRetrying(此FileInfo self,int delayMs=100,int numberofthreads=3)
{
for(int i=0;i

这不是一个理想的解决方案,我希望有人能提供更好的解决方案。但是,对于测试未删除文件的影响在何处是可管理的,这可能就足够了。

哪个文件被锁定?每次都是同一个文件吗?是否可以使用Windows资源管理器将坏文件复制到其他文件夹?为什么
result
在循环外部声明,但在循环内部删除?看起来有点confusing@jdweng在我的帖子中添加了解释。在循环
@“e:\test.zip”
之外声明的文件被锁定。e:\是什么类型的驱动器?我不相信这个错误信息。由于锁定以外的其他原因,可能的失败。您正在使用网络驱动器。可能有问题。试试c:\。Zip文件具有与包含块/扇区的驱动器相似的文件结构。我发现在过去的zip实用程序中,如果驱动器的块/扇区结构与运行的机器代码不同,那么它通常无法工作。20年前,在工作中,我们将软件项目归档在文件服务器上,但无法解压缩文件。我们使用的是Win95,文件服务器(映射网络驱动器)是一台linux机器。当我们在Win95上存档时,Zip工作得很好。谢谢。删除操作不是问题或实际代码的一部分。它是基准的一部分,与问题无关。应该在我的问题中加上这个,很抱歉
    public static void DeleteRetrying(this FileInfo self, int delayMs = 100, int numberOfAttempts = 3)
    {
        for (int i = 0; i < numberOfAttempts-1; i++)
        {
            try
            {
                self.Delete();
            }
            catch (IOException)
            {
                // Consider making the method async and
                // replace this with Task.Delay
                Thread.Sleep(delayMs);
            }
        }
        // Final attempt, let the exception propagate
        self.Delete();
    }