Zip-файлы в .Net 4.5 без сторонних библиотек

У меня есть форма Windows (сделанная с помощью vb), где бизнес-пользователь может вводить номера документов в многострочное текстовое поле, каждое число может иметь от одного до нескольких документов под этим номером, т.е. если они вводят 12345, то в gridview будут отображаться 4 документа ( название документов и описание), которые соответствуют этому номеру документа.

Теперь я понял, как анализировать номера документов, поскольку, если они хотят ввести более одного, их нужно разделить запятой (благодаря stackoverflow: D!), Поэтому у меня есть этот список имен документов, и я искал этот сайт, но я Не могу понять, как пройти через этот список имен документов из моего каталога и заархивировать их в папку без сторонних библиотек, таких как dotnet и т. д., поскольку мне это не разрешено.

Я знаю о статических классах .NET (? Не уверен, что это правильный термин) "zipfile" и "ziparchive" с system.IO и system.IO.compression, но, просмотрев веб-сайт msdn и ответы здесь, я нашел ответы, касающиеся написания строк в файл для добавления в папку zip-файлов или создание их в папке.

Итак, мой вопрос: можно ли каким-либо образом просмотреть этот список имен документов, создать папку zip-файлов и добавить их в созданную папку zip-файлов? Пока я дошел до этого в отношении путей 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

Любые советы или указания о том, как добавить документы из папки в папку zipfile в .net с vb, приветствуются!


person jean55    schedule 08.06.2016    source источник
comment
without 3rd party libraries like dotnet это не третья сторона, это часть платформы 4.5. Если это так, напишите свой собственный алгоритм сжатия, это было бы началом ...   -  person zaggler    schedule 08.06.2016
comment
@Zaggler, спасибо за ответ! но из того, что я прочитал, мне нужно скачать dotnetziplibrary, чтобы использовать его? Я попытался написать свой собственный алгоритм, но я не понимаю, как добавлять файлы в zip-архив или zip-файл. Я могу только найти, как создать запись и записать ее в нее или записать в существующий файл.   -  person jean55    schedule 08.06.2016
comment
Итак, вы хотите add поместить в архив или хотите create zip-файл с файлами, какой именно?   -  person zaggler    schedule 08.06.2016
comment
@Zappler Прошу прощения за путаницу, я хочу создать папку zip и добавить существующие файлы (в данном случае документы) в папку .zip, это возможно?   -  person jean55    schedule 08.06.2016
comment
Итак, вы хотите создать новый zip и добавить к нему файлы, если я прав?   -  person zaggler    schedule 08.06.2016
comment
@Zaggler да! Точно, большое спасибо за помощь, я попробую ваш пример и расскажу, как это происходит! еще раз спасибо. edit: Простите, быстрый вопрос, как я могу объединить несколько файлов? Могу ли я сохранить свой код выше, а затем ссылаться на него в вашем примере?   -  person jean55    schedule 08.06.2016


Ответы (2)


Я хочу создать 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
person zaggler    schedule 08.06.2016
comment
спасибо, сработало! но файлы, добавленные в zip-файл, не являются PDF-файлами, они просто говорят, что файл и не открываются, есть ли способ фактически скопировать PDF-файлы в zip? - person jean55; 08.06.2016
comment
@ jean55 интересно, так как я работал с некоторыми текстовыми документами и работал нормально. Он должен добавить файл (сжатый) в zip файл ... Позвольте мне попробовать на моем конце с _2 _... - person zaggler; 08.06.2016
comment
@ jean55, где указано ENTRY NAME, вы обязательно включили extention файла? Например: .pdf - person zaggler; 08.06.2016
comment
@ jean55 Я могу это подтвердить. Если вы не укажете расширение, будет создан пустой файл. Вы должны обязательно включить расширение файла, как упомянуто выше ... - person zaggler; 08.06.2016

Для более простого использования, если вы хотите заархивировать все файлы, содержащиеся в существующей папке.

Это проще, потому что вам не нужно указывать полное имя файла, он просто берет все файлы, найденные в папке. Однако вы должны указать расширение «.zip» в имени файла «destination_file.zip».

Как указано в другом ответе, вам нужно добавить две ссылки в свой проект.

  1. System.IO.Compression
  2. System.IO.Compression.FileSystem

И добавьте эти операторы импорта в свой файл класса.

 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.

Допустим, у вас есть элемент управления DataGridView с именем dgv1, заполненный несколькими строками данных, и вы несколько раз выбрали несколько из этих строк, а полный путь / имя файла находится в первом столбце 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

Если вы предпочитаете накапливать файлы в архиве (вместо перезаписи), константу «ZipArchiveMode.Create» можно изменить на «ZipArchiveMode.Update» в вызове ZipFile.Open () zipEm ().

person an odder guest    schedule 20.07.2016