VB.Net, как читать сжатый текстовый файл непосредственно в массив строк - PullRequest
1 голос
/ 23 марта 2012

Можно ли прочитать сжатый текстовый файл, как обычный текстовый файл, без необходимости сначала извлекать его, и если да, то как? В настоящее время я должен извлечь файл, прочитать все строки в массив строк, а затем удалить извлеченный файл.

Dim arrLines() As String
Try
    oApp.Namespace(Application.StartupPath).CopyHere(oApp.Namespace(strZipFilename).Items.Item(CStr(filename)))
    arrLines = IO.File.ReadAllLines(Application.StartupPath & "\" & filename)
    Dim FSO = CreateObject("Scripting.FileSystemObject")
    FSO.DeleteFile(Application.StartupPath & "\" & filename)
Catch ex As Exception
    Return False
End Try
'do stuff with arrLines...

Я бы предпочел не делать этого. Если бы кто-то мог сказать мне, как сделать что-то вроде IO.File.ReadAllLines(oApp.Namespace(strZipFilename).Items.Item(CStr(filename))) БЕЗ использования сторонних библиотек, я бы очень признателен.

Ответы [ 2 ]

2 голосов
/ 02 августа 2012

Этот код работает для чтения сжатого потока GZip и возврата текста сжатого файла по одной строке за раз. Без сторонних библиотек в настоящее время невозможно распаковать файл, сжатый с помощью PKZip. System.IO.Packaging разархивирует некоторые файлы, но он относительно ограничен. Однако есть некоторая надежда для встроенной функции .

    Public Shared Iterator Function ReadAllCompressedLines(path As String) As IEnumerable(Of String)
        Using rawStream = New System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)
            Using cstream = New System.IO.Compression.GZipStream(rawStream, System.IO.Compression.CompressionMode.Decompress)
                Dim currLine As String = ""
                Dim currentByte As Integer
                currentByte = cstream.ReadByte()
                While currentByte <> -1
                    currLine += Convert.ToChar(currentByte)
                    If currLine.EndsWith(vbCrLf) Then
                        Dim rc = Trim(currLine)
                        If rc.Length > 0 Then
                            Yield rc
                        End If
                        currLine = ""
                    End If
                    currentByte = cstream.ReadByte()
                End While
            End Using
        End Using
    End Function

    Private Shared Function Trim(currLine As String) As String
        '\x00EF\x00BB\x00BF
        Return currLine.TrimEnd(ControlChars.Cr, ControlChars.Lf).TrimStart(Convert.ToChar(&HEF), Convert.ToChar(&HBB), Convert.ToChar(&HBF))
    End Function
1 голос
/ 31 августа 2016

Этого можно добиться с помощью:

  1. Добавить ссылки на System.IO.Comression и System.IO.Compression.FileSystem
  2. Добавить импорт System.IO.Compression

Затем вы можете использовать следующий код для чтения содержимого в файл и сохранения его в строковой переменной.В этом конкретном примере у меня есть сжатое имя файла «File1.txt», хранящееся в текстовом поле в главной форме (tbFile), и у меня есть содержимое сжатого файла, отображаемое в текстовом поле (tb1) в главной форме.

Private Sub bRead_Click(sender As Object, e As EventArgs) Handles bRead.Click
    Try
        Using archive As ZipArchive = Compression.ZipFile.Open(zipDest, ZipArchiveMode.Read)
            Dim entry As ZipArchiveEntry = archive.GetEntry(tbFile.Text)
            Dim s As String = ""
            Using sr As StreamReader = New StreamReader(entry.Open())
                s = sr.ReadToEnd()
            End Using
            tb1.Text = s
        End Using
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub
...