每当我尝试执行以下代码时,我都会收到错误“Stream is not writable”。我知道在内存中仍然有对流的引用,但我不知道如何解决这个问题。这两个代码块按顺序调用。我认为第二个可能是函数调用或者调用堆栈中的两个更深层次,但我认为这不重要,因为我在第一个块中有“using”语句应该自动清理流。我确信这是C#中的常见任务,我只是不知道该怎么做......
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);
}
}
非常感谢任何帮助。谢谢!
安德鲁
答案 0 :(得分:11)
嵌入式资源会编译到您的程序集中,您无法编辑它们。
答案 1 :(得分:1)
如上所述,嵌入资源是只读的。我的建议,如果适用,(比如说您的嵌入式资源是数据库文件,XML,CSV等。)将提取空白资源到与程序相同的位置,并读取/写入提取的资源。
示例伪代码:
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.
希望这有帮助。
其他强>
您的嵌入资源可能完全空白,包含数据结构和/或默认值。
答案 2 :(得分:1)
有点晚了,但对于后代=) 关于embedded .txt:
是的,在运行时你无法编辑嵌入式,因为它是嵌入式的。您可以使用反汇编程序进行一些操作,但只能使用外部程序集,这些程序集将在当前上下文中加载。
如果您想在程序启动之前向资源写入一些实际信息,并且不将数据保存在单独的文件中,则会出现黑客攻击。
我曾经在winCE和compact .Net上工作过一段时间,你不能允许在运行时使用ResourceManager存储字符串。我需要一些动态信息,以便在它实际抛出启动之前捕获dllNotFoundException。 所以我创建了嵌入式txt文件,我在预构建事件中填写了该文件。
像这样:cd $(ProjectDir)
dir ..\bin\Debug /a-d /b> assemblylist.txt
这里我得到调试文件夹中的文件
和阅读:
using (var f = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("Market_invent.assemblylist.txt")))
{
str = f.ReadToEnd();
}
因此,您可以在预构建事件中继续执行所有操作。
享受!它非常有用,可以存储一些重要信息,并有助于避免多余的操作。