c# - 无法访问已被其他进程使用的文件

标签 c# wpf file mvvm zip

嗨,我在WPF应用程序中有一个按钮,该按钮从zip中提取文件集。我需要使用提取的文件夹中的文件。但是在提取后,如果我访问该文件,我会不断收到异常消息,说明“文件已被其他进程使用,无法访问”。
我使用了Stream.flush(),Stream.Close(),Stream.Dispose()。它们都没有用。

var zipFilePath = @"C:\Output.zip";
var tempFolderPath = @"C:\Unzipped";


    using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
    {
        foreach (PackagePart part in package.GetParts())
        {

            var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
            var targetDir = target.Remove(target.LastIndexOf('\\'));

            if (!Directory.Exists(targetDir))
                Directory.CreateDirectory(targetDir);
            MemoryStream memoryStream = new MemoryStream(); 
           using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
           // using (Stream source = new FileStream(, FileMode.Open)) 
            {

              source.CopyTo(File.OpenWrite(target));
            //   CopyStreamTo(source, memoryStream); 
             }
        }

    }


    MessageBox.Show("Extracted in a folder");

          myclass obj=new myclass(@"C:\Unzipped\Something.xml");
        // Something.xml has been used by some other process  

提取效果很好。但是提取后,当我访问C:\Unzipped\something.xml中的文件时,我仍然收到此错误。
我该如何解决?

最佳答案

您应该通过将IDisposposable资源包装在using语句中来处理它们:

using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
{
    foreach (PackagePart part in package.GetParts())
    {
        var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
        var targetDir = target.Remove(target.LastIndexOf('\\'));

        if (!Directory.Exists(targetDir))
        {
            Directory.CreateDirectory(targetDir);
        }

        using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
        using (Stream targetFileStream = File.OpenWrite(target))
        {
            source.CopyTo(targetFileStream);
        }
    }
}

关于c# - 无法访问已被其他进程使用的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14252040/

相关文章:

C# 在任务栏缩略图上显示按钮

c# - 将菜单添加到加载项内的 Visual Studio 菜单栏

c# - 我如何从一个集合转换为另一个集合

Java顺序解析文件中的信息

c# - Visual Studio 上的新文件被标记为 Miscellaneous

c# - 通过 Visual Studio Automation 设置项目的 OutputPath 属性

c# - 无法在 WPF 桌面应用程序中添加 "using System.Windows.Media.Imaging;"

c# - WPF 数据网格 : How To Keep Selected Rows Highlighted?

使用 mvvm 模式的 WPF 数据绑定(bind)问题

python - 计算不同文件的平均单元格值