没有第 3 方库的 .Net 4.5 中的 Zip 文件
Zip Files in .Net 4.5 without 3rd party libraries
我有一个 windows 表单(由 vb 制作),业务用户可以在其中在多行文本框中输入文档编号,每个编号可以在该编号下包含一对多的文档,即如果他们输入 12345,然后 gridview 将显示与该文档编号对应的 4 个文档(文档名称和描述)。
现在我想出了如何解析文档编号,因为如果他们想输入多个文档,则需要用逗号分隔(感谢 Whosebug :D!)所以我有这个文档名称列表,我有搜索了这个站点,但我无法理解如何从我的目录中循环遍历该文档名称列表并将它们压缩到没有第 3 方库(如 dotnet 等)的文件夹,因为我不允许。
我知道 .NET 的静态(?不确定这个词是否正确)class "zipfile" 和 "ziparchive" 以及 system.IO 和 system.IO.compression但是查看 msdn 网站和此处的答案,我找到了与在文件中写入行以添加到 zipfile 文件夹或在文件夹中创建它们相关的答案。
所以我的问题是,无论如何我都可以遍历该文档名称列表并创建一个 zipfile 文件夹并将它们添加到创建的 zipfile 文件夹中?到目前为止,关于 zip 路径,我得到了下面显示的列表中每个 "file" 的文档名称和路径(我在上面谈到过):
Dim values As String = TextBox1.Text.Replace(" ", ",")
Dim DocNum As String() = values.Trim().Split(","c)
Dim fullitems As String
For Each s As String In DocNum
Dim files() As String = Directory.GetFiles("\folder path" & s)
If files.Length > 0 Then
For i As Integer = 0 To files.Length - 1
fullitems = files(i).ToString
Next i
End If
Next
任何关于如何使用 vb 将文件夹中的文档添加到 .net 中的 zipfile 文件夹的建议或指导,我们将不胜感激!
I want to create a zip folder and add existing files (in this case documents) to the .zip folder, is that possible?
是的,这是可能的。首先,您需要添加一些对项目的引用。
- System.IO.Compression
- System.IO.Compression.文件系统
接下来,将这些 Import
语句添加到您的 class 文件中。
Imports System.IO
Imports System.IO.Compression
我使用按钮单击事件来执行此操作,但您可以将其放置在您想要的任何位置...
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Using modFile As ZipArchive = ZipFile.Open("ZIP PATH HERE", ZipArchiveMode.Update)
modFile.CreateEntryFromFile("FILE YOU WANT TO ADD", "ENTRY NAME")
End Using
End Sub
为了更简单的使用,如果您希望压缩现有文件夹中包含的所有文件。
这更简单,因为您不必确保指定完整的文件名,它只需要在文件夹中找到的所有文件。不过,您必须在 "destination_file.zip" 文件名上指定“.zip”扩展名。
如另一个答案所示,您需要为您的项目添加两个引用。
- System.IO.Compression
- System.IO.Compression.文件系统
并将这些 Import 语句添加到您的 class 文件中。
Imports System.IO
Imports System.IO.Compression
这是按钮点击例程中的一些代码,可以放在其他地方。如您所见,这只是一行代码。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ZipFile.CreateFromDirectory("Folder you want to zip",
"destination_file.zip",
CompressionLevel.Optimal,
False)
End Sub
但您似乎希望将所选文件发送到 .zip 存档。
假设您有一个名为 dgv1 的 DataGridView 控件,其中填充了多行数据并且您选择了其中的几行,并且完整的 path/file 名称在 DataGridView 的第一列中。
有一个辅助函数 (selectedList()) 可以将 datagridview 中的选定单元格格式化为完整的 path/file 名称列表。
zipEm() 函数获取文件列表和目标存档文件名并制作一个 .zip 文件。
Button1_Click()例程调用前两个例程并向用户提供反馈。
' returns list of items from column col that are selected
Function selectedList(dgv1 As DataGridView, col As Integer) As List(Of String)
selectedList = New List(Of String)
For Each cell As DataGridViewCell In dgv1.SelectedCells
If cell.ColumnIndex = col Then selectedList.Add(cell.Value.ToString())
Next
End Function
' archives a list of files to the designated file (overwriting, if it already exists)
Function zipEm(fileList As List(Of String), nzfName As String) As Boolean
Try
If File.Exists(nzfName) Then File.Delete(nzfName)
Using newZipFile As ZipArchive = ZipFile.Open(nzfName, ZipArchiveMode.Create)
For Each pfn As String In fileList
newZipFile.CreateEntryFromFile(pfn, Path.GetFileName(pfn))
Next
End Using
Catch ex As Exception
Return False
End Try
Return True
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim fileList As List(Of String) = selectedList(dgv1, 0)
If fileList.Count = 0 Then
MsgBox("No valid items selected.", vbExclamation, "'lil problem")
Exit Sub
End If
Dim nzfName As String = Path.Combine(Path.GetDirectoryName(fileList(0)),
"sample (" & fileList.Count.ToString() & " items).zip")
If zipEm(fileList, nzfName) Then
MsgBox("Saved zip file containing " & fileList.Count.ToString() & " items.",
vbOKOnly, "sucess")
Else
MsgBox("Unable to save .zip file.", vbExclamation, "'lil problem")
End If
End Sub
如果您更喜欢将文件累积到存档(而不是覆盖),可以在 ZipFile.Open() 中将常量 "ZipArchiveMode.Create" 更改为 "ZipArchiveMode.Update" zipEm() 例程的调用。
我有一个 windows 表单(由 vb 制作),业务用户可以在其中在多行文本框中输入文档编号,每个编号可以在该编号下包含一对多的文档,即如果他们输入 12345,然后 gridview 将显示与该文档编号对应的 4 个文档(文档名称和描述)。
现在我想出了如何解析文档编号,因为如果他们想输入多个文档,则需要用逗号分隔(感谢 Whosebug :D!)所以我有这个文档名称列表,我有搜索了这个站点,但我无法理解如何从我的目录中循环遍历该文档名称列表并将它们压缩到没有第 3 方库(如 dotnet 等)的文件夹,因为我不允许。
我知道 .NET 的静态(?不确定这个词是否正确)class "zipfile" 和 "ziparchive" 以及 system.IO 和 system.IO.compression但是查看 msdn 网站和此处的答案,我找到了与在文件中写入行以添加到 zipfile 文件夹或在文件夹中创建它们相关的答案。
所以我的问题是,无论如何我都可以遍历该文档名称列表并创建一个 zipfile 文件夹并将它们添加到创建的 zipfile 文件夹中?到目前为止,关于 zip 路径,我得到了下面显示的列表中每个 "file" 的文档名称和路径(我在上面谈到过):
Dim values As String = TextBox1.Text.Replace(" ", ",")
Dim DocNum As String() = values.Trim().Split(","c)
Dim fullitems As String
For Each s As String In DocNum
Dim files() As String = Directory.GetFiles("\folder path" & s)
If files.Length > 0 Then
For i As Integer = 0 To files.Length - 1
fullitems = files(i).ToString
Next i
End If
Next
任何关于如何使用 vb 将文件夹中的文档添加到 .net 中的 zipfile 文件夹的建议或指导,我们将不胜感激!
I want to create a zip folder and add existing files (in this case documents) to the .zip folder, is that possible?
是的,这是可能的。首先,您需要添加一些对项目的引用。
- System.IO.Compression
- System.IO.Compression.文件系统
接下来,将这些 Import
语句添加到您的 class 文件中。
Imports System.IO
Imports System.IO.Compression
我使用按钮单击事件来执行此操作,但您可以将其放置在您想要的任何位置...
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Using modFile As ZipArchive = ZipFile.Open("ZIP PATH HERE", ZipArchiveMode.Update)
modFile.CreateEntryFromFile("FILE YOU WANT TO ADD", "ENTRY NAME")
End Using
End Sub
为了更简单的使用,如果您希望压缩现有文件夹中包含的所有文件。
这更简单,因为您不必确保指定完整的文件名,它只需要在文件夹中找到的所有文件。不过,您必须在 "destination_file.zip" 文件名上指定“.zip”扩展名。
如另一个答案所示,您需要为您的项目添加两个引用。
- System.IO.Compression
- System.IO.Compression.文件系统
并将这些 Import 语句添加到您的 class 文件中。
Imports System.IO
Imports System.IO.Compression
这是按钮点击例程中的一些代码,可以放在其他地方。如您所见,这只是一行代码。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ZipFile.CreateFromDirectory("Folder you want to zip",
"destination_file.zip",
CompressionLevel.Optimal,
False)
End Sub
但您似乎希望将所选文件发送到 .zip 存档。
假设您有一个名为 dgv1 的 DataGridView 控件,其中填充了多行数据并且您选择了其中的几行,并且完整的 path/file 名称在 DataGridView 的第一列中。
有一个辅助函数 (selectedList()) 可以将 datagridview 中的选定单元格格式化为完整的 path/file 名称列表。
zipEm() 函数获取文件列表和目标存档文件名并制作一个 .zip 文件。
Button1_Click()例程调用前两个例程并向用户提供反馈。
' returns list of items from column col that are selected
Function selectedList(dgv1 As DataGridView, col As Integer) As List(Of String)
selectedList = New List(Of String)
For Each cell As DataGridViewCell In dgv1.SelectedCells
If cell.ColumnIndex = col Then selectedList.Add(cell.Value.ToString())
Next
End Function
' archives a list of files to the designated file (overwriting, if it already exists)
Function zipEm(fileList As List(Of String), nzfName As String) As Boolean
Try
If File.Exists(nzfName) Then File.Delete(nzfName)
Using newZipFile As ZipArchive = ZipFile.Open(nzfName, ZipArchiveMode.Create)
For Each pfn As String In fileList
newZipFile.CreateEntryFromFile(pfn, Path.GetFileName(pfn))
Next
End Using
Catch ex As Exception
Return False
End Try
Return True
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim fileList As List(Of String) = selectedList(dgv1, 0)
If fileList.Count = 0 Then
MsgBox("No valid items selected.", vbExclamation, "'lil problem")
Exit Sub
End If
Dim nzfName As String = Path.Combine(Path.GetDirectoryName(fileList(0)),
"sample (" & fileList.Count.ToString() & " items).zip")
If zipEm(fileList, nzfName) Then
MsgBox("Saved zip file containing " & fileList.Count.ToString() & " items.",
vbOKOnly, "sucess")
Else
MsgBox("Unable to save .zip file.", vbExclamation, "'lil problem")
End If
End Sub
如果您更喜欢将文件累积到存档(而不是覆盖),可以在 ZipFile.Open() 中将常量 "ZipArchiveMode.Create" 更改为 "ZipArchiveMode.Update" zipEm() 例程的调用。