Guest User

VB.NET File Binder by KoC part2

a guest
Aug 4th, 2015
234
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         'Eerst openen we de SaveFileDialog
  2.         'en kijken weer of deze is gesloten met de OK knop
  3.         If SaveFileDialog1.ShowDialog = DialogResult.OK Then
  4.  
  5.             'Dan lezen we de stub als een Byte Array
  6.             'de stub maken we in het volgende deel van deze tutorial
  7.             Dim stub() As Byte = File.ReadAllBytes("stub.exe")
  8.  
  9.             'newFile is de FileStream van de nieuwe 'gebinde' executable
  10.             'Met FileMode.Create wordt het bestand gelijkt aangemaakt
  11.             Dim newFile As New FileStream(SaveFileDialog1.FileName, FileMode.Create)
  12.  
  13.             'Schrijf de Bytes van de stub.exe naar het nieuwe bestand
  14.             newFile.Write(stub, 0, stub.Length)
  15.            
  16.             'dan schrijven we hoeveel bestanden we precies gaan binden
  17.             'deze informatie heeft de stub straks nodig
  18.             'onze stub is zo ingesteld dat hij straks deze 4 bytes leest als de totale aantal files
  19.             'Waarom 4 Bytes? omdat een Int32 (Integer) uit 32bits bestaat. 32 bits / 8 = 4 Bytes
  20.             newFile.Write(BitConverter.GetBytes(Convert.ToInt32(ListView1.Items.Count)), 0, 4)
  21.  
  22.             'Oke, tijd om de bestanden toe te voegen!
  23.             'Loop door elk bestand en noem het 'item'
  24.             For Each item In ListView1.Items
  25.  
  26.                 'Weet je nog dat we de bestandsnaam, grootte en extensie hebben toegevoegd?
  27.                 'Die kunnen we nu bereiken met
  28.                 'item.SubItems(0).Text = de bestandsnaam
  29.                 'item.SubItems(1).Text = de grootte van het bestand in Bytes
  30.                 'item.SubItems(2).Text = de bestandsextensie
  31.  
  32.                 'Dan openen we het bestand door weer een FileStream te maken
  33.                 'en deze noemen we ook weer 'fs'
  34.                 Dim fs = File.OpenRead(item.SubItems(0).Text)
  35.  
  36.                 'Nu maken we een Byte Array (een array met Bytes)
  37.                 'en noemen die 'ext' voor de extensie
  38.                 'Weet je nog dat we in het begin 'Imports System.Text' hebben gedaan?
  39.                 'Dat hebben we nu nodig om de extensie String om te zetten naar een Byte Array.
  40.                 Dim ext() As Byte = Encoding.ASCII.GetBytes(item.SubItems(2).Text)
  41.  
  42.                 'ASCII encoding gebruikt 1 Byte voor elk karakter
  43.                 'We hebben 8 Bytes gereserveerd voor de extensie
  44.                 'Maar wat als de extensie maar 3 karakters (dus 3 Bytes) is?
  45.  
  46.                 'Als we deze Bytes niet opvullen krijgen we een error bij het schrijven
  47.                 'We willen namelijk 8 Bytes schrijven en hebben er misschien minder
  48.  
  49.                 'Dus vullen we de Byte array genaamd 'ext' op tot 8 items, met lege items (Null Bytes)
  50.                 ReDim Preserve ext(7) '7 = 8 items, want hij begint bij 0
  51.  
  52.                 'Dan kijken we of we het bestand kunnen lezen
  53.                 'Weet je nog dat we het bestand geopend hadden met de naam 'fs' ?
  54.                 If fs.CanRead Then
  55.                     'We maken een Byte Array met dezelfde hoeveelheid items als het bestand Bytes heeft
  56.                     'We gebruiken nu fs.Length maar we konden net zo goed item.SubItems(1).Text gebruiken
  57.                     'Alleen is dat een String en zouden we dat eerst om moeten zetten naar een Integer
  58.                     'Vandaar dat ik opnieuw de grootte van het bestand uitlees
  59.                     Dim fileBytes(fs.Length - 1) As Byte 'waarom '- 1'? Een array begint bij 0 en 'Length' bij 1
  60.                     'Dan lezen we het bestand en schrijven de inhoud ervan naar de 'fileBytes' array
  61.                     fs.Read(fileBytes, 0, fs.Length)
  62.  
  63.                     'Nu gaan we weer in de nieuwe 'gebinde' executable schrijven.
  64.                     'Deze FileStream hadden 'newFile' genoemd
  65.  
  66.                     'Na de stub en de hoeveelheid files, wat we hierboven al geschreven hebben,
  67.                     'schrijven we nu, in de volgende 4 Bytes de grootte van dit bestand die we willen binden
  68.                     'Zoals je bij de uitleg misschien hebt gelezen: een Int32 (Integer) is 4 Bytes
  69.                     newFile.Write(BitConverter.GetBytes(Convert.ToInt32(fs.Length)), 0, 4)
  70.                     'in de volgende 8 bytes schrijven we de extensie
  71.                     'als we 'ext' niet hadden opgevuld en de extensie heeft minder dan 8 tekens
  72.                     'dan zouden we hier een error krijgen
  73.                     newFile.Write(ext, 0, 8)
  74.                     'En als laatst schrijven we de bytes van het bestand zelf naar de nieuwe executable
  75.                     newFile.Write(fileBytes, 0, fs.Length)
  76.  
  77.                     'En natuurlijk moeten we de FileStream weer sluiten om RAM vrij te maken
  78.                     fs.Close()
  79.                 Else 'Als we het bestand niet kunnen lezen:
  80.                     'Verwijder dan het nieuwe bestand wat we tot nu toe geschreven hebben,
  81.                     File.Delete(SaveFileDialog1.FileName)
  82.                     'Sluit weer de FileStream
  83.                     fs.Close()
  84.                     'en geef een error.
  85.                     MsgBox("File cannot be read:" & vbCrLf & item.SubItems(0).Text)
  86.                     'Exit For stopt de 'For' Loop zodat er niet nieuwe bestanden toegevoegd worden wanneer we een error hebben
  87.                     Exit For
  88.                 End If
  89.             Next
  90.  
  91.             'als alle bestanden successvol geschreven zijn, sluit het bestand
  92.             newFile.Close()
  93.             'en laat een berichtje zien dat we klaar zijn!
  94.             MsgBox(ListView1.Items.Count & " files successfully bound.")
  95.  
  96.         End If
RAW Paste Data