Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>The question commenters are correct, this is probably a task best left for a setup program. However, that having been stated, in the interest of answering the question as asked I offer the following approach.</p> <p>Contrary to your supposition in your question comment, you do need to "read" the embedded resource from the GUI's executable file, since it's an <em>embedded</em> resource and not an <em>external</em> resource. It won't magically extract itselt from the executable file. You need to do the manual read from the assembly and write to your specified locations. To do this, you need to read the resource using .Net Reflection, via the currently executing assembly's GetManifestResourceStream method.</p> <p>The <code>Simulation.exe</code> file is a binary file so it must be handled as such. I assumed that the <code>Orginal.inp</code> file was a text file since it afforded the opportunity to demonstrate different types of file reads and writes. Any error handling (and there should be plenty) is omitted for brevity.</p> <p>The code could look something like this:</p> <pre><code>Imports System.IO Imports System.Reflection Module Module1 Sub Main() 'Determine where the GUI executable is located and save for later use Dim thisAssembly As Assembly = Assembly.GetExecutingAssembly() Dim appFolder As String = Path.GetDirectoryName(thisAssembly.Location) Dim fileContents As String = String.Empty 'Read the contents of the template file. It was assumed this is in text format so a 'StreamReader, adept at reading text files, was used to read the entire file into a string 'N.B. The namespace that prefixes the file name in the next line is CRITICAL. An embedded resource 'is placed in the executable with the namespace noted in the project file, so it must be 'dereferenced in the same manner. Using fileStream As Stream = thisAssembly.GetManifestResourceStream("SOQuestion10613051.Original.inp") If fileStream IsNot Nothing Then Using textStreamReader As New StreamReader(fileStream) fileContents = textStreamReader.ReadToEnd() textStreamReader.Close() End Using fileStream.Close() End If End Using 'Create the "input" subfolder if it doesn't already exist Dim inputFolder As String = Path.Combine(appFolder, "input") If Not Directory.Exists(inputFolder) Then Directory.CreateDirectory(inputFolder) End If 'Write the contents of the resource read above to the input sub-folder Using writer As New StreamWriter(Path.Combine(inputFolder, "Original.inp")) writer.Write(fileContents) writer.Close() End Using 'Now read the simulation executable. The same namespace issues noted above still apply. 'Since this is a binary file we use a file stream to read into a byte buffer Dim buffer() As Byte = Nothing Using fileStream As Stream = thisAssembly.GetManifestResourceStream("SOQuestion10613051.Simulation.exe") If fileStream IsNot Nothing Then ReDim buffer(fileStream.Length) fileStream.Read(buffer, 0, fileStream.Length) fileStream.Close() End If End Using 'Now write the byte buffer with the contents of the executable file to the root folder If buffer IsNot Nothing Then Using exeStream As New FileStream(Path.Combine(appFolder, "Simulation.exe"), FileMode.Create, FileAccess.Write, FileShare.None) exeStream.Write(buffer, 0, buffer.Length) exeStream.Close() End Using End If End Sub End Module </code></pre> <p>You will also have to add logic to determine if the files have been extracted so it doesn't happen every time the GUI is invoked. That's a big reason why an installation program might be the correct answer.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload