25. januar 2013 - 16:47Der er
30 kommentarer og 1 løsning
Lave ZIP-filer prgramatisk med undermapper
Hej
Jeg skal lave en zip-fil der indeholder nogle filer som jeg har embedded som en resource samt en tekstfil jeg jeg har som en lang string/StreamWriter. Nogle af filerne skal ligge i en undermappe. Er det muligt uden at skulle benytte 3.parts dll'er (Jeg bruger .NET 4.5) og hvordan ?
Hvis ikke er der så et gratis produkt jeg kan benytte ?
Dim readmeEntry As ZipArchiveEntry = archive.CreateEntry("Readme.txt")
Dim readmeEntry As ZipArchiveEntry = archive.CreateEntry("mappe\SomeOtherFile.txt")
Der findes ikke mapper i en zip-fil. Der er filer i form af navngivne blokke af binære data - og en liste over disse filers stier. Mapperne bliver først skabt ved udpakningen
Private Sub Zip(fileName As String) Dim startBuffer() As Byte = {80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} FileIO.FileSystem.WriteAllBytes(fileName, startBuffer, False)
Using zipToOpen As FileStream = New FileStream(fileName, FileMode.Open) Using archive As ZipArchive = New ZipArchive(zipToOpen, ZipArchiveMode.Update) Dim readmeEntry As ZipArchiveEntry = archive.CreateEntry("Readme.txt") Dim readmeEntry2 As ZipArchiveEntry = archive.CreateEntry("mappe\SomeOtherFile.txt")
Using writer As StreamWriter = New StreamWriter(readmeEntry.Open()) writer.WriteLine("Dette er en fil i roden af zip'en.") End Using
Using writer As StreamWriter = New StreamWriter(readmeEntry2.Open()) writer.WriteLine("Dette er en fil i mappen 'mappe'.") End Using End Using End Using End Sub
Imports System Imports System.IO Imports System.IO.Compression
Namespace E Public Class Program Private Const REP As Integer = 100 Public Shared Sub Main(args As String()) Dim text As String = "This is a little test !!!!" Dim buf As Byte() = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } Using fs As New FileStream("C:\work\sysiocmp.zip", FileMode.Create, FileAccess.Write) Using za As New ZipArchive(fs, ZipArchiveMode.Create) Dim tzae As ZipArchiveEntry = za.CreateEntry("xxx/test.txt") Using sw As New StreamWriter(tzae.Open()) For i As Integer = 0 To REP - 1 sw.WriteLine(text) Next End Using Dim bzae As ZipArchiveEntry = za.CreateEntry("xxx/test.bin") Using s As Stream = bzae.Open() For i As Integer = 0 To REP - 1 s.Write(buf, 0, buf.Length) Next End Using End Using End Using End Sub End Class End Namespace
Namespace E Public Class Program Private Const REP As Integer = 100 Public Shared Sub Main(args As String()) Dim text As String = "This is a little test !!!!" Dim buf As Byte() = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} Using fs As New FileStream("C:\work\shrpzplb.zip", FileMode.Create, FileAccess.Write) Using zos As New ZipOutputStream(fs) Dim tze As New ZipEntry("xxx/test.txt") zos.PutNextEntry(tze) Dim sw As New StreamWriter(zos) For i As Integer = 0 To REP - 1 sw.WriteLine(text) Next sw.Flush() ' do not attempt to close Dim bze As New ZipEntry("xxx/test.bin") zos.PutNextEntry(bze) For i As Integer = 0 To REP - 1 zos.Write(buf, 0, buf.Length) Next End Using End Using End Sub End Class End Namespace
Hvordan gemmer man så en fil gemt som ressource som en entry i zip-filen ?
Det er noget i denne blok
Dim bzae As ZipArchiveEntry = za.CreateEntry("xxx/test.bin") Using s As Stream = bzae.Open() For i As Integer = 0 To REP - 1 s.Write(buf, 0, buf.Length) Next End Using
Tænker at det er noget med denne kommando jeg skal bruge: My.Resources.ResourceManager.GetStream("tmp.jpg") men kan ikke få det koblet sammen...
Dim rs As Stream = My.Resources.ResourceManager.GetStream("tmp.jpg") Dim bzae As ZipArchiveEntry = za.CreateEntry("xxx/test.bin") Using s As Stream = bzae.Open() Dim n As Integer = rs.Read((buf, 0, buf.Length) s.Write(buf, 0, n) End Using
du boer dog nok have en while loekke omkring Read og Write
Dim rs As Stream = My.Resources.ResourceManager.GetStream("tmp.jpg") virker åbenbart heller ikke - rs er tom, selvom der er en fil med navn tmp.jpg som embedded ressource...
Har fået det til at virke ved at bruge GetManifestResourceStream i stedet. Det er vist noget med hvordan man tilføjer tilen som emdeded resource. Bruger dog stadig Dim buf As Byte() = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} da Dim buf as Byte(10240) ikke virker.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.