gpt4 book ai didi

vb.net - 如何压缩vb.net 2.0中的文件夹及其子文件夹?

转载 作者:行者123 更新时间:2023-12-02 06:30:20 24 4
gpt4 key购买 nike

我有一个名为 Main1 的文件夹。在该文件夹内,我有多个文件夹。喜欢

Folders1
Folders2
Folders3
Folders4

每个文件夹都有自己的文件。我的要求是压缩“Main1”文件夹,包括所有子文件夹及其文件。

我不想使用任何第三方工具。我计划将命名空间 System.Compression 与 Gzip 一起使用。请各位大佬指教。

最佳答案

ZipFile.CreateFromDirectory()可以轻松地为您做到这一点。只需将 Day1 文件夹的路径传递给它,它就会将整个文件夹压缩为 zip 文件。您可以使用 System.IO.Directory 类迭代所有 Day 文件夹。

(刚刚意识到您想坚持使用 .NET Fx 2.0。在该版本中没有直接的方法可以做到这一点。您必须使用您不希望使用的第 3 方库,或者执行低-级别的东西)。

编辑

如果您确实倾向于手动完成,这里有一个粗略的方法:

  1. 获取 Day 目录中所有目录的列表(递归);称之为DirList
  2. 获取 Day 目录中所有文件的列表(递归);称之为FilesList
  3. 创建一个 Dictionary(Of String, String) 并将每个文件的名称存储在 FilesList 中及其内容的 BASE64 表示形式;名称作为键,内容作为值。
  4. 使用 .NET 的内置 XML 序列化将词典保存到 XML 文件。
  5. 在文件的最开始处,注入(inject) DirList 的内容。
  6. 再次保存文件。 (您也可以一步完成步骤 4-6)。
  7. 以二进制形式读取此文件并使用 GZip 压缩整个内容。
  8. 将其写入 zip 文件。

要解压缩此文件:

  1. 打开文件并使用 GZip 解压缩并获取全部内容。
  2. 从顶部获取目录列表并递归创建所有目录。
  3. 完整阅读剩余部分,并使用 XML 序列化从中创建您的 Dictionary 对象。
  4. 迭代字典并使用Key部分创建文件,然后通过将其Value从BASE64转换回二进制来将内容注入(inject)到文件中。

如果您对这些步骤有任何疑问,请告诉我。

编辑2

以下代码针对 .NET 2.0 编译,将压缩和解压缩目录:

Public Function ZipDirectory(DirPath As String) As Byte()
If Not Directory.Exists(DirPath) Then Return Nothing

Dim Directories = Directory.GetDirectories(DirPath, "*", SearchOption.AllDirectories)
Dim Files = Directory.GetFiles(DirPath, "*", SearchOption.AllDirectories)

Dim X As New XmlDocument
Dim RootNode = X.CreateElement("Content")
Dim DirsNode = X.CreateElement("Directories")
Dim FilesNode = X.CreateElement("Directories")

X.AppendChild(RootNode)
RootNode.AppendChild(DirsNode)
RootNode.AppendChild(FilesNode)

For Each d In Directories
Dim DirNode = X.CreateElement("Directory")
Dim PathAttrib = X.CreateAttribute("Path")
PathAttrib.Value = d.Replace(DirPath & "\", "") 'Create relative paths
DirNode.Attributes.Append(PathAttrib)
DirsNode.AppendChild(DirNode)
Next

For Each f In Files
Dim FileNode = X.CreateElement("File")
Dim PathAttrib = X.CreateAttribute("Path")
PathAttrib.Value = f.Replace(DirPath & "\", "") 'Create relative paths
FileNode.Attributes.Append(PathAttrib)
FileNode.InnerText = Convert.ToBase64String(File.ReadAllBytes(f))
FilesNode.AppendChild(FileNode)
Next

Using Mem As New MemoryStream()
X.Save(Mem)
Dim AllContentsAsByteArray = Mem.ToArray()
Dim CompressedContent = CompressArray(AllContentsAsByteArray)
Return CompressedContent
End Using
End Function

Public Sub UnzipDirectory(compressed() As Byte, outputPath As String)
If Not Directory.Exists(outputPath) Then Directory.CreateDirectory(outputPath)

Dim Uncompressed = DecompressArray(Compressed)

Dim X As New XmlDocument

Using Mem As New MemoryStream(Uncompressed)
X.Load(Mem)

Dim RootNode = X.FirstChild
Dim DirsNode = RootNode.FirstChild
Dim FilesNode = RootNode.FirstChild.NextSibling

For Each ChildDir In DirsNode.ChildNodes
Directory.CreateDirectory(Path.Combine(outputPath, DirectCast(ChildDir, XmlNode).Attributes.Item(0).Value))
Next

For Each ChildFile In FilesNode.ChildNodes
Dim FilePath = Path.Combine(outputPath, DirectCast(ChildFile, XmlNode).Attributes.Item(0).Value)
Dim Content = Convert.FromBase64String(DirectCast(ChildFile, XmlNode).InnerText)
File.WriteAllBytes(FilePath, Content)
Next
End Using
End Sub

Private Function CompressArray(ByVal content() As Byte) As Byte()
Using outFile As New MemoryStream()
Using Compress As New GZipStream(outFile, CompressionMode.Compress)
Compress.Write(content, 0, content.Length)
End Using

Return outFile.ToArray()
End Using
End Function

Private Function DecompressArray(ByVal content() As Byte) As Byte()
Using outFile As New MemoryStream()
Using inFile As New MemoryStream(content)
Using Compress As New GZipStream(inFile, CompressionMode.Decompress)
Dim buffer(1023) As Byte
Dim nRead As Integer
Do
nRead = Compress.Read(buffer, 0, buffer.Length)
outFile.Write(buffer, 0, nRead)
Loop While nRead > 0
End Using
End Using

Return outFile.ToArray()
End Using
End Function

代码应该这样使用:

'To zip a directory
Dim Compressed = ZipDirectory("C:\SomeDir")
File.WriteAllBytes("C:\somedir.zip", Compressed)

'To unzip a zipped file
Dim Compressed = File.ReadAllBytes("C:\somedir.zip")
UnzipDirectory(Compressed, "C:\SomeDir2")

关于vb.net - 如何压缩vb.net 2.0中的文件夹及其子文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36981613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com