How to Discover the "Path" of an Embedded Resource

How can I discover the path of an embedded resource?

This will get you a string array of all the resources:

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();

C# Get full path of embedded ressource?

The path to the resource is of the form namespace.projectfolder.filename.ext.

In order to read the contents, you can use a helper class like this one

public class ResourceReader
{
// to read the file as a Stream
public static Stream GetResourceStream(string resourceName)
{
Assembly assembly = Assembly.GetExecutingAssembly();
Stream resourceStream = assembly.GetManifestResourceStream(resourceName);
return resourceStream;
}

// to save the resource to a file
public static void CreateFileFromResource(string resourceName, string path)
{
Stream resourceStream = GetResourceStream(resourceName);
if (resourceStream != null)
{
using (Stream input = resourceStream)
{
using (Stream output = File.Create(path))
{
input.CopyTo(output);
}
}
}
}
}

Is there a way to get a string path reference to an embedded resource file?

You can use Assembly.GetManifestResourceStream(resource_name_of_the_file) to access the file's stream, write it to TEMP directory and use this path.

For example, if you have a file in your project at the path "Resources\Files\File.txt" and the project's assembly default namespace is "RootNamespace", you can access the file's stream from within this assembly's code with

Assembly.GetExecutingAssembly().GetManifestResourceStream("RootNamespace.Resources.Files.File.txt")

Path to an embedded resource file

I think it will help you in some what...

//Get the assembly.
System.Reflection.Assembly CurrAssembly = System.Reflection.Assembly.LoadFrom(System.Windows.Forms.Application.ExecutablePath);

//Gets the image from Images Folder.
System.IO.Stream stream = CurrAssembly.GetManifestResourceStream("ImageURL");

if (null != stream)
{
//Fetch image from stream.
MyShortcut.IconLocation = System.Drawing.Image.FromStream(stream);
}

File path of embedded resource?

Properties.Resources.MYWAVFILE is not a path string. It's a representation of the file stored in memory, hence it's System.IO.UnmanagedMemoryStream.

Either find a overloaded function that takes in streams instead of file paths in string form or copy the embedded resource to disk and use it :

using (var fileStream = File.Create("C:\\Path\\To\\File"))
{
Properties.Resources.MYWAVFILE.CopyTo(fileStream);
}

C# Get embedded resources from specific folder or distinguish between embedded resources in different folders

The resources are returned in the following format.

[Namespace].[Folder].[Filename]

Note that all folders in the path are separated by .'s. So if you had an embedded resource with the following configuration


myproject.csproj (Namespace = com.mycompany.myproject)
- Resources
- Images
- Icons
- my_icon.ico

The resource name would be...

com.mycompany.myproject.Resources.Images.Icons.my_icon.ico

If you want to select all from a specific folder, you could use the following LINQ expression or modify it according to your needs.

string prefix = "your_namespace.your_folder."

var resourceNames = Assembly.GetExecutingAssembly()
.GetManifestResourceNames()
.Where(name => name.StartsWith(prefix));

How to get the path of an embebbed resource?

Like others have said, an embedded resource is embedded within the compiled assembly and does not exist on the file system; if you're looking to have the file on the file system you should change the build action to 'None' and the Copy to Output Directory to one of the copy values.

If however you do mean to embed the resource then it can be accessed by using the GetManifestResourceStream method of the Assembly class as follows:

GetType().Assembly.GetManifestResourceStream("someresourcestringhere")

(The above code assumes you are accessing the resource from a class within the same assembly).

The embedded resource normally follows the following format and this is the string you would pass in to the GetManifestResourceStream method:

default project namespace.folder name (if any).file name

Any spaces in folder names are replaced with an underscore, any spaces in file names are preserved.

Personally I have found the easiest way to get this string is to use a decompiler tool (such as Telerik's Just Decompile) to have a look inside the assembly and get the full resource name for the file you're looking for.

.net - Get embedded resource path from Assembly

I think the resource name is qualified by the project's RootNamespace, rather than its DefaultNamespace, so this seems to work in the .fsproj file:

  <PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<RootNamespace>UnitTests.Core</RootNamespace>
</PropertyGroup>

This is implemented by the CreateFSharpManifestResourceName build task.

Loop through Embedded Resources and copy to local path

Start by getting all resources embedded in your assembly:

Assembly.GetExecutingAssembly().GetManifestResourceNames()

You can check these names against the name of your desired subfolder to see if they are inside or outside it with a simple call to StartsWith.

Now loop through the names, and get the corresponding resource stream:

const string subfolder = "WINFORMSAPP.Resources.SUBFOLDER.";
var assembly = Assembly.GetExecutingAssembly();
foreach (var name in assembly.GetManifestResourceNames()) {
// Skip names outside of your desired subfolder
if (!name.StartsWith(subfolder)) {
continue;
}
using (Stream input = assembly.GetManifestResourceStream(name))
using (Stream output = File.Create(path + name.Substring(subfolder.Length))) {
input.CopyTo(output);
}
}


Related Topics



Leave a reply



Submit