1

こんにちは、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 のファイルにアクセスすると、このエラーが発生し続けます。どうすれば解決できますか??

4

1 に答える 1

3

IDisposable リソースは、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);
        }
    }
}
于 2013-01-10T06:33:00.470 に答える