您错误地使用了 Zip 库
实际上,您尝试打开一个目录,就像它是一个 zip 文件一样,然后循环该目录的内容(实际上也是一个 zip 文件),然后尝试提取每个成员into不同的 zip 文件
这是您所描述的您正在尝试做的事情的一个工作示例:
string strStartPath = @"PATH TO FILES TO PUT IN ZIP FILE";
string strZipPath = @"PATH TO ZIP FILE";
if (File.Exists(strZipPath))
File.Delete(strZipPath);
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles())
{
if (!(file.FullName.EndsWith(".TIF", StringComparison.OrdinalIgnoreCase)))
{
archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
}
}
}
这将获取文件夹的所有根级别内容并将其放入 zip 文件中。您将需要实现自己的方式来递归获取子文件夹及其内容,但这超出了本问题的范围。
编辑:这是一个工作示例,具有正确的文件夹递归来选择所有文件,甚至在子目录中
public void ZipFolder()
{
string strStartPath = @"PATH TO FILES TO PUT IN ZIP FILE";
string strZipPath = @"PATH TO ZIP FILE";
if (File.Exists(strZipPath))
File.Delete(strZipPath);
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
foreach (FileInfo file in RecurseDirectory(strStartPath))
{
if (!(file.FullName.EndsWith(".TIF", StringComparison.OrdinalIgnoreCase)))
{
var destination = Path.Combine(file.DirectoryName, file.Name).Substring(strStartPath.Length + 1);
archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), destination);
}
}
}
}
public IEnumerable<FileInfo> RecurseDirectory(string path, List<FileInfo> currentData = null)
{
if (currentData == null)
currentData = new List<FileInfo>();
var directory = new DirectoryInfo(path);
foreach (var file in directory.GetFiles())
currentData.Add(file);
foreach (var d in directory.GetDirectories())
RecurseDirectory(d.FullName, currentData);
return currentData;
}