2

It is actually useful for me to store some files in EXE to copy to selected location. I'm generating HTML and JS files and need to copy some CSS, JS and GIFs.

Snippet

System.IO.File.WriteAllBytes(@"C:\MyFile.bin", ProjectNamespace.Properties.Resources.MyFile);

doesn't work for me!

On "WriteAllBytes" it says: "cannot convert from 'System.Drawing.Bitmap' to 'byte[]'" for image and "cannot convert from 'string' to 'byte[]'" for text file.

Help!

UPDATE: Solved below.

1
  • 1
    If you have solved the problem, click the green check mark beside the most helpful answer. Commented Jun 10, 2010 at 0:59

4 Answers 4

7

Add the files you want to your solution and then set their Build Action property to Embedded Resource. This will embed the file into your exe. (msdn)

Then you just need to write the code to write the file out to disk when the exe is executed.

Something like:

File.Copy("resource.bmp", @"C:\MyFile.bin");

Replace resource.bmp with your file name.

Addendum:

If you keep the file in a sub-folder in your solution you need to make the sub-folder part of the path to resource.bmp. Eg:

File.Copy(@"NewFolder1\resource.bmp", @"C:\MyFile.bin");

Also, you may need to set the Copy To Output Directory property to Copy Always or Copy If Newer.

Sign up to request clarification or add additional context in comments.

8 Comments

You right, it must be "Embedded Resource", but just File.Copy() doesn't work here. I found the solution.
It works for me... Did you change the "resource.bmp" to the right file name?
Shure. But it doesn't. Seems that File.Copy() works only with textfiles. I left my solution here.
What happens if you don't copy a text file? I tried the above with a bmp.
Don't know. I post my universal solution below and it works with any kind of file. Easy as copy&paste + set a "Build Action".
|
1

I assume you added the files through the Project Properties window. That does not allow you to add an arbitrary file but it does support TextFiles, Bitmaps and so on.

For an embedded TextFile, use

  File.WriteAllText(@"C:\MyFile.bin", Properties.Resources.TextFile1);

For an Image, use

  Properties.Resources.Image1.Save(@"C:\MyFile.bin");

Comments

0

You can embed binary files in a .resx file. Put them in the Files section (it looks like you used the Images section instead). It should be accessible as an array of bytes if your .resx file generates a .Designer.cs file.

File.WriteAllBytes(@"C:\foobar.exe", Properties.Resources.foobar);

Comments

0

Add files to project resources and set their "Build Action" as "Embedded Resource".

Now extract any file (text or binary) using this snippet:

WriteResourceToFile("Project_Namespace.Resources.filename_as_in_resources.extension", "extractedfile.txt");


public static void WriteResourceToFile(string resourceName, string fileName)
{
    int bufferSize = 4096; // set 4KB buffer
    byte[] buffer = new byte[bufferSize];
    using (Stream input = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
    using (Stream output = new FileStream(fileName, FileMode.Create))
    {
        int byteCount = input.Read(buffer, 0, bufferSize);
        while (byteCount > 0)
        {
            output.Write(buffer, 0, byteCount);
            byteCount = input.Read(buffer, 0, bufferSize);
        }
    }
}

Don't know how deep is it correct according to this article: http://www.yoda.arachsys.com/csharp/readbinary.html but it works.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.