使用 .NET ZipArchive 压缩整个目录以及额外信息
Using .NET ZipArchive to zip entire directories AS well as extra info
我继承了一些使用 ZipArchive 从数据库中保存一些信息的代码。它使用 BinaryFormatter 来执行此操作。当您使用 7-zip(例如)查看 zip 文件时,您会看到几个文件夹和一个 .txt 文件。一切正常。我只是想修改代码,使 ZipArchive 中也有一个名为 "temp" 的文件夹,该文件夹由 C:\temp 下的文件和文件夹组成。有没有一种简单的方法可以添加由整个文件夹或光盘组成的条目(ZipArchiveEntry?)?我在ZipArchive的成员方法中看到了"CreateEntryFromFile",但是没有看到CreateEntryFromDirectory。或者也许还有其他一些简单的方法可以做到这一点?有人有示例代码吗?我应该说 C:\temp 可以有可变数量的文件和目录(有子目录和文件等)。我必须以某种方式枚举它们,使用 CreateEntryFromFile 创建我自己的目录吗?感谢您的帮助。
同样,当我读取 ZipArchive 时,我想把与 C:\temp 相关的东西转储到一个目录中(如 C:\temp_old)
谢谢,
戴夫
user1469065 在 Zip folder in C# 中的回答对我有用。 user1469065 展示了如何获取目录中的所有 files/directories(使用一些很酷的 "yield" 语句)然后进行序列化。为了完整起见,我确实按照 user1469065 的建议添加了反序列化代码(至少我认为我按照他的建议做了)。
private static void ReadTempFileStuff(ZipArchive archive) // adw
{
var sessionArchives = archive.Entries.Where(x => x.FullName.StartsWith(@"temp_directory_contents")).ToArray();
if (sessionArchives != null && sessionArchives.Length > 0)
{
foreach (ZipArchiveEntry entry in sessionArchives)
{
FileInfo info = new FileInfo(@"C:\" + entry.FullName);
if (!info.Directory.Exists)
{
Directory.CreateDirectory(info.DirectoryName);
}
entry.ExtractToFile(@"C:\" + entry.FullName,true);
}
}
}
我继承了一些使用 ZipArchive 从数据库中保存一些信息的代码。它使用 BinaryFormatter 来执行此操作。当您使用 7-zip(例如)查看 zip 文件时,您会看到几个文件夹和一个 .txt 文件。一切正常。我只是想修改代码,使 ZipArchive 中也有一个名为 "temp" 的文件夹,该文件夹由 C:\temp 下的文件和文件夹组成。有没有一种简单的方法可以添加由整个文件夹或光盘组成的条目(ZipArchiveEntry?)?我在ZipArchive的成员方法中看到了"CreateEntryFromFile",但是没有看到CreateEntryFromDirectory。或者也许还有其他一些简单的方法可以做到这一点?有人有示例代码吗?我应该说 C:\temp 可以有可变数量的文件和目录(有子目录和文件等)。我必须以某种方式枚举它们,使用 CreateEntryFromFile 创建我自己的目录吗?感谢您的帮助。
同样,当我读取 ZipArchive 时,我想把与 C:\temp 相关的东西转储到一个目录中(如 C:\temp_old) 谢谢, 戴夫
user1469065 在 Zip folder in C# 中的回答对我有用。 user1469065 展示了如何获取目录中的所有 files/directories(使用一些很酷的 "yield" 语句)然后进行序列化。为了完整起见,我确实按照 user1469065 的建议添加了反序列化代码(至少我认为我按照他的建议做了)。
private static void ReadTempFileStuff(ZipArchive archive) // adw
{
var sessionArchives = archive.Entries.Where(x => x.FullName.StartsWith(@"temp_directory_contents")).ToArray();
if (sessionArchives != null && sessionArchives.Length > 0)
{
foreach (ZipArchiveEntry entry in sessionArchives)
{
FileInfo info = new FileInfo(@"C:\" + entry.FullName);
if (!info.Directory.Exists)
{
Directory.CreateDirectory(info.DirectoryName);
}
entry.ExtractToFile(@"C:\" + entry.FullName,true);
}
}
}