簡體   English   中英

不含第三方庫的.Net 4.5中的Zip文件

[英]Zip Files in .Net 4.5 without 3rd party libraries

我有一個Windows窗體(用vb制作),業務用戶可以在多行文本框中輸入文檔編號,每個編號可以在該編號下包含一個或多個文檔,即如果輸入12345,則gridview將顯示4個文檔(與該文件編號相對應的文件名稱和說明)。

現在,我想出了如何解析文檔編號的方法,因為如果要輸入多個文檔編號,則需要用逗號分隔(由於stackoverflow:D!),所以我有此文檔名稱列表,我已經搜索了該站點,但是我無法理解如何從我的目錄中遍歷該文檔名稱列表,並將其壓縮到沒有第三方網絡(如dotnet等)的文件夾中,因為不允許我這樣做。

我知道System.IO和system.IO.compression的.NET靜態(?不確定是否使用正確的術語)類“ zipfile”和“ ziparchive”,但查看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將文件從文件夾添加到zipfile文件夾中的建議或指導都應得到贊賞!

我想創建一個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

為了簡化使用,如果您希望壓縮現有文件夾中包含的所有文件。

這比較簡單,因為您不必確保指定完整的文件名,它只需要獲取文件夾中找到的所有文件。 不過,您必須在“ destination_file.zip”文件名上指定“ .zip”擴展名。

如另一個答案所示,您需要向項目添加兩個引用。

  1. System.IO.Compression
  2. 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
    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

如果您希望將文件累積到存檔中(而不是覆蓋文件),則可以在zipEm()例程的ZipFile.Open()調用中將常量“ ZipArchiveMode.Create”更改為“ ZipArchiveMode.Update”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM