等待 .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);
}
}
MAIN
和 READY
都是我的子目录,整个包 ("main") 和排序文件 ("ready")。
但是,当 运行 这样做时,zip 文件尚未解压缩 - 发生异常,显示它无法访问指定的文件,即使它从 Directory.GetFiles()
中获取了它的名称。解压缩 zip 文件时创建的文件夹仅在我终止我的控制台应用程序后显示(难怪它无法访问它)。
所以最大的问题是 - 我怎样才能等待解压缩的文件夹出现?我尝试使用 Thread.Sleep()
,但无论如何它都不影响流程 - 异常仍然发生,并且该文件夹仅在我终止应用程序后显示。
我假设你得到了一个类似 "The process cannot access the file...because it is being used by another process."
的 IOException
我看你的复制方法有问题。看起来您的起点和终点路径基本相同。所以系统无法覆盖该文件,因为您当前打开它以供阅读。
澄清一下 - 这个问题与解压缩无关!在您编写的示例中,变量 file
和 destFile
将相同 - 它们需要不同。
你的错误在这里:
string destFile = Path.Combine(targetLocation + @"\MAIN\PHOTO", fileName);
应该是:
string destFile = Path.Combine(targetLocation + @"\READY\PHOTO", fileName);
您正试图将文件复制到同一位置。
我正在尝试编写一个小型控制台应用程序工具来解压缩包含多个 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);
}
}
MAIN
和 READY
都是我的子目录,整个包 ("main") 和排序文件 ("ready")。
但是,当 运行 这样做时,zip 文件尚未解压缩 - 发生异常,显示它无法访问指定的文件,即使它从 Directory.GetFiles()
中获取了它的名称。解压缩 zip 文件时创建的文件夹仅在我终止我的控制台应用程序后显示(难怪它无法访问它)。
所以最大的问题是 - 我怎样才能等待解压缩的文件夹出现?我尝试使用 Thread.Sleep()
,但无论如何它都不影响流程 - 异常仍然发生,并且该文件夹仅在我终止应用程序后显示。
我假设你得到了一个类似 "The process cannot access the file...because it is being used by another process."
的 IOException我看你的复制方法有问题。看起来您的起点和终点路径基本相同。所以系统无法覆盖该文件,因为您当前打开它以供阅读。
澄清一下 - 这个问题与解压缩无关!在您编写的示例中,变量 file
和 destFile
将相同 - 它们需要不同。
你的错误在这里:
string destFile = Path.Combine(targetLocation + @"\MAIN\PHOTO", fileName);
应该是:
string destFile = Path.Combine(targetLocation + @"\READY\PHOTO", fileName);
您正试图将文件复制到同一位置。