没有第三方库的.Net 4.5中的Zip文件

时间:2016-06-08 01:08:51

标签: .net vb.net winforms zip ziparchive

我有一个Windows窗体(用vb制作),业务用户可以在多行文本框中输入文档编号,每个编号在该编号下可以有一个到多个文档,即如果他们输入12345,则gridview将显示4与该文档编号对应的文档(文档名称和描述)。

现在我想出了如何解析文档编号,因为如果他们想要输入多个他们需要用逗号分隔(感谢stackoverflow:D!)所以我有这个文档名称列表,我搜索了这个网站,但我无法理解如何从我的目录循环文档名称列表,并将其压缩到没有像dotnet等第三方库的文件夹,因为我不被允许。

我知道.NET的静态(?不确定是否合适的术语)类“zipfile”和“ziparchive”与system.IO和system.IO.compression但是看了msdn网站和答案在这里我找到了相关的答案在文件中写入行以添加到zipfile文件夹或在文件夹中创建它们。

所以我的问题是,无论如何我在哪里可以遍历文档名称列表并创建一个zipfile文件夹并将它们添加到创建的zipfile文件夹中?到目前为止,我在zip路径方面做得很远,我在下面的列表中找到了每个“文件”的文档名称和路径(我在上面谈到过):

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文件夹的任何建议或指示,我们表示赞赏!

2 个答案:

答案 0 :(得分:1)

  

我想创建一个zip文件夹并将现有文件(在本例中为文档)添加到.zip文件夹,这可能吗?

是的,这是可能的。首先,您需要为项目添加一些引用。

  • System.IO.Compression
  • System.IO.Compression.FileSystem

接下来,将这些Import语句添加到您的类文件中。

 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

答案 1 :(得分:1)

为了更简单的使用,如果您希望压缩现有文件夹中包含的所有文件。

这更简单,因为您不必确保指定完整文件名,它只需要在文件夹中找到所有文件。但是,您必须在“destination_file.zip”文件名中指定“.zip”扩展名。

如另一个答案所示,您需要为项目添加两个引用。

  1. System.IO.Compression
  2. System.IO.Compression.FileSystem
  3. 并将这些Import语句添加到您的类文件中。

     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控件,其中填充了多行数据,并且多选了一些这些行,并且完整路径/文件名位于第一列DataGridView。

    有一个辅助函数( selectedList())将所选单元格从datagridview格式化为完整路径/文件名列表。

    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()例程。