我已将sample.txt
(它只包含一行“aaaa”)文件嵌入到项目的资源中,就像在此answer中一样。
当我试图这样读它时:
string s = File.ReadAllText(global::ConsoleApplication.Properties.Resources.sample);
我收到System.IO.FileNotFoundException'异常。 其他信息:找不到文件'd:\ Work \ Projects \ MyTests \ ConsoleApplication \ ConsoleApplication \ bin \ Debug \ aaaa'。
所以看起来它正试图从我的资源文件中取出文件名,而不是读取这个文件。为什么会这样?如何让它读取sample.txt
尝试@Ryios的解决方案并获得参数null异常
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ConsoleApplication.Resources.sample.txt"))
{
TextReader tr = new StreamReader(stream);
string fileContents = tr.ReadToEnd();
}
该文件位于 d:\ Work \ Projects \ MyTests \ ConsoleApplication \ ConsoleApplication \ Resources \ sample.txt
P.S。解决了。我必须在sample.txt属性中设置Build Action - embed资源
答案 0 :(得分:9)
您无法使用File.ReadAllText读取资源文件。
相反,您需要使用Assembly.GetManifestResourceStream打开资源流。
你也没有传递路径,你传递了一个命名空间。该文件的命名空间将是程序集默认命名空间+文件所在项目中的文件夹heieracy +文件名。
想象一下这个结构
因此该文件的名称空间为:
xyz.project.Folder1.Folder2.SomeFile.Txt
然后你会这样读它
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("xyz.project.Folder1.Folder2.SomeFile.Txt"))
{
TextReader tr = new StreamReader(stream);
string fileContents = tr.ReadToEnd();
}
答案 1 :(得分:3)
您好建议的解决方案无法正常工作
此返回null
:
Assembly.GetExecutingAssembly().GetManifestResourceStream("xyz.project.Folder1.Folder2.SomeFile.Txt")
另一种方法是使用MemoryStream
中的Ressource Data
:
byte[] aa = Properties.Resources.YOURRESSOURCENAME;
MemoryStream MS =new MemoryStream(aa);
StreamReader sr = new StreamReader(MS);
不理想,但有效