How To Write To An Embedded Resource?

心已入冬 提交于 2019-11-28 05:29:17

问题


I keep getting the error "Stream was not writable" whenever I try to execute the following code. I understand that there's still a reference to the stream in memory, but I don't know how to solve the problem. The two blocks of code are called in sequential order. I think the second one might be a function call or two deeper in the call stack, but I don't think this should matter, since I have "using" statements in the first block that should clean up the streams automatically. I'm sure this is a common task in C#, I just have no idea how to do it...

string s = "";

using (Stream manifestResourceStream =
    Assembly.GetExecutingAssembly().GetManifestResourceStream("Datafile.txt"))
{
    using (StreamReader sr = new StreamReader(manifestResourceStream))
    {
        s = sr.ReadToEnd();
    }
}

...

string s2 = "some text";

using (Stream manifestResourceStream =
    Assembly.GetExecutingAssembly().GetManifestResourceStream("Datafile.txt"))
{
    using (StreamWriter sw = new StreamWriter(manifestResourceStream))
    {
        sw.Write(s2);
    }
}

Any help will be very much appreciated. Thanks!

Andrew


回答1:


Embedded resources are compiled into your assembly, you can't edit them.




回答2:


As stated above, embedded resources are read only. My recommendation, should this be applicable, (say for example your embedded resource was a database file, XML, CSV etc.) would be to extract a blank resource to the same location as the program, and read/write to the extracted resource.

Example Pseudo Code:

if(!Exists(new PhysicalResource())) //Check to see if a physical resource exists.
{
    PhysicalResource.Create(); //Extract embedded resource to disk.
}

PhysicalResource pr = new PhysicalResource(); //Create physical resource instance.

pr.Read(); //Read from physical resource.

pr.Write(); //Write to physical resource.

Hope this helps.

Additional:

Your embedded resource may be entirely blank, contain data structure and / or default values.




回答3:


A bit late, but for descendants=) About embedded .txt:

Yep, on runtime you couldnt edit embedded because its embedded. You could play a bit with disassembler, but only with outter assemblies, which you gonna load in current context.

There is a hack if you wanna to write to a resource some actual information, before programm starts, and to not keep the data in a separate file.

I used to worked a bit with winCE and compact .Net, where you couldnt allow to store strings at runtime with ResourceManager. I needed some dynamic information, in order to catch dllNotFoundException before it actually throws on start. So I made embedded txt file, which I filled at the pre-build event.

like this:

cd $(ProjectDir)
dir ..\bin\Debug /a-d /b> assemblylist.txt

here i get files in debug folder

and the reading:

using (var f = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("Market_invent.assemblylist.txt")))
        {
            str = f.ReadToEnd();
        }  

So you could proceed all your actions in pre-build event run some exes.

Enjoy! Its very usefull to store some important information and helps avoid redundant actions.



来源:https://stackoverflow.com/questions/3736267/how-to-write-to-an-embedded-resource

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!