Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'Eerst openen we de SaveFileDialog
- 'en kijken weer of deze is gesloten met de OK knop
- If SaveFileDialog1.ShowDialog = DialogResult.OK Then
- 'Dan lezen we de stub als een Byte Array
- 'de stub maken we in het volgende deel van deze tutorial
- Dim stub() As Byte = File.ReadAllBytes("stub.exe")
- 'newFile is de FileStream van de nieuwe 'gebinde' executable
- 'Met FileMode.Create wordt het bestand gelijkt aangemaakt
- Dim newFile As New FileStream(SaveFileDialog1.FileName, FileMode.Create)
- 'Schrijf de Bytes van de stub.exe naar het nieuwe bestand
- newFile.Write(stub, 0, stub.Length)
- 'dan schrijven we hoeveel bestanden we precies gaan binden
- 'deze informatie heeft de stub straks nodig
- 'onze stub is zo ingesteld dat hij straks deze 4 bytes leest als de totale aantal files
- 'Waarom 4 Bytes? omdat een Int32 (Integer) uit 32bits bestaat. 32 bits / 8 = 4 Bytes
- newFile.Write(BitConverter.GetBytes(Convert.ToInt32(ListView1.Items.Count)), 0, 4)
- 'Oke, tijd om de bestanden toe te voegen!
- 'Loop door elk bestand en noem het 'item'
- For Each item In ListView1.Items
- 'Weet je nog dat we de bestandsnaam, grootte en extensie hebben toegevoegd?
- 'Die kunnen we nu bereiken met
- 'item.SubItems(0).Text = de bestandsnaam
- 'item.SubItems(1).Text = de grootte van het bestand in Bytes
- 'item.SubItems(2).Text = de bestandsextensie
- 'Dan openen we het bestand door weer een FileStream te maken
- 'en deze noemen we ook weer 'fs'
- Dim fs = File.OpenRead(item.SubItems(0).Text)
- 'Nu maken we een Byte Array (een array met Bytes)
- 'en noemen die 'ext' voor de extensie
- 'Weet je nog dat we in het begin 'Imports System.Text' hebben gedaan?
- 'Dat hebben we nu nodig om de extensie String om te zetten naar een Byte Array.
- Dim ext() As Byte = Encoding.ASCII.GetBytes(item.SubItems(2).Text)
- 'ASCII encoding gebruikt 1 Byte voor elk karakter
- 'We hebben 8 Bytes gereserveerd voor de extensie
- 'Maar wat als de extensie maar 3 karakters (dus 3 Bytes) is?
- 'Als we deze Bytes niet opvullen krijgen we een error bij het schrijven
- 'We willen namelijk 8 Bytes schrijven en hebben er misschien minder
- 'Dus vullen we de Byte array genaamd 'ext' op tot 8 items, met lege items (Null Bytes)
- ReDim Preserve ext(7) '7 = 8 items, want hij begint bij 0
- 'Dan kijken we of we het bestand kunnen lezen
- 'Weet je nog dat we het bestand geopend hadden met de naam 'fs' ?
- If fs.CanRead Then
- 'We maken een Byte Array met dezelfde hoeveelheid items als het bestand Bytes heeft
- 'We gebruiken nu fs.Length maar we konden net zo goed item.SubItems(1).Text gebruiken
- 'Alleen is dat een String en zouden we dat eerst om moeten zetten naar een Integer
- 'Vandaar dat ik opnieuw de grootte van het bestand uitlees
- Dim fileBytes(fs.Length - 1) As Byte 'waarom '- 1'? Een array begint bij 0 en 'Length' bij 1
- 'Dan lezen we het bestand en schrijven de inhoud ervan naar de 'fileBytes' array
- fs.Read(fileBytes, 0, fs.Length)
- 'Nu gaan we weer in de nieuwe 'gebinde' executable schrijven.
- 'Deze FileStream hadden 'newFile' genoemd
- 'Na de stub en de hoeveelheid files, wat we hierboven al geschreven hebben,
- 'schrijven we nu, in de volgende 4 Bytes de grootte van dit bestand die we willen binden
- 'Zoals je bij de uitleg misschien hebt gelezen: een Int32 (Integer) is 4 Bytes
- newFile.Write(BitConverter.GetBytes(Convert.ToInt32(fs.Length)), 0, 4)
- 'in de volgende 8 bytes schrijven we de extensie
- 'als we 'ext' niet hadden opgevuld en de extensie heeft minder dan 8 tekens
- 'dan zouden we hier een error krijgen
- newFile.Write(ext, 0, 8)
- 'En als laatst schrijven we de bytes van het bestand zelf naar de nieuwe executable
- newFile.Write(fileBytes, 0, fs.Length)
- 'En natuurlijk moeten we de FileStream weer sluiten om RAM vrij te maken
- fs.Close()
- Else 'Als we het bestand niet kunnen lezen:
- 'Verwijder dan het nieuwe bestand wat we tot nu toe geschreven hebben,
- File.Delete(SaveFileDialog1.FileName)
- 'Sluit weer de FileStream
- fs.Close()
- 'en geef een error.
- MsgBox("File cannot be read:" & vbCrLf & item.SubItems(0).Text)
- 'Exit For stopt de 'For' Loop zodat er niet nieuwe bestanden toegevoegd worden wanneer we een error hebben
- Exit For
- End If
- Next
- 'als alle bestanden successvol geschreven zijn, sluit het bestand
- newFile.Close()
- 'en laat een berichtje zien dat we klaar zijn!
- MsgBox(ListView1.Items.Count & " files successfully bound.")
- End If
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement