等待 .zip 文件解压缩,然后再以编程方式将其内容复制到其他地方

Wait for .zip file to extract before copying it's contents elsewhere programmaticaly

我正在尝试编写一个小型控制台应用程序工具来解压缩包含多个 files/folders/other 存档的存档并以另一种方式排列其内容。

我使用 ZipFile.ExtractToDirectory 方法从 System.IO.Compression.FileSystem 库中解压根文件:

public static void UnzipPackage(string packagePath, string targetPath) 
{
    try
    {
        ZipFile.ExtractToDirectory(packagePath, targetLocation);
        Console.WriteLine("Unzipping file {0} complete.", packagePath);
    }
    catch (DirectoryNotFoundException)
    {
        Console.WriteLine("Directory was not found.");
    }
    catch (FileNotFoundException)
    {
        Console.WriteLine("File was not found.");
    }
}

在我的包上使用 运行 这个方法后,我想将这个包中的一个文件复制到一个子文件夹中。

根据 MSDN 我这样做:

if (!Directory.Exists(targetLocation + @"READY\PHOTO"))
{
    Directory.CreateDirectory(targetLocation + @"\READY\PHOTO");
}
if (Directory.Exists(targetLocation + @"\MAIN\PHOTO"))
{
    string[] files = Directory.GetFiles(targetLocation + @"\MAIN\PHOTO");
    foreach (var file in files)
    {
        string fileName = Path.GetFileName(file);
        string destFile = Path.Combine(targetLocation + @"\MAIN\PHOTO", fileName);
        File.Copy(file, destFile, true);
    }
}

MAINREADY 都是我的子目录,整个包 ("main") 和排序文件 ("ready")。

但是,当 运行 这样做时,zip 文件尚未解压缩 - 发生异常,显示它无法访问指定的文件,即使它从 Directory.GetFiles() 中获取了它的名称。解压缩 zip 文件时创建的文件夹仅在我终止我的控制台应用程序后显示(难怪它无法访问它)。

所以最大的问题是 - 我怎样才能等待解压缩的文件夹出现?我尝试使用 Thread.Sleep(),但无论如何它都不影响流程 - 异常仍然发生,并且该文件夹仅在我终止应用程序后显示。

我假设你得到了一个类似 "The process cannot access the file...because it is being used by another process."

的 IOException

我看你的复制方法有问题。看起来您的起点和终点路径基本相同。所以系统无法覆盖该文件,因为您当前打开它以供阅读。

澄清一下 - 这个问题与解压缩无关!在您编写的示例中,变量 filedestFile 将相同 - 它们需要不同。

你的错误在这里:

string destFile = Path.Combine(targetLocation + @"\MAIN\PHOTO", fileName);

应该是:

string destFile = Path.Combine(targetLocation + @"\READY\PHOTO", fileName);

您正试图将文件复制到同一位置。