从资源中读取文件
Reading a file from resources
我已经将 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 的解决方案并得到Argument 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 属性
中嵌入资源
您无法使用 File.ReadAllText 读取资源文件。
相反,您需要使用 Assembly.GetManifestResourceStream 打开资源流。
您也不向其传递路径,而是向其传递命名空间。文件的命名空间将是程序集默认命名空间 + 文件所在项目中的文件夹继承权 + 文件名。
想象一下这个结构
- 项目(xyz.project)
- 文件夹1
- 文件夹2
- SomeFile.Txt
所以文件的命名空间将是:
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();
}
您好,建议的解决方案不起作用
这个returnnull
:
Assembly.GetExecutingAssembly().GetManifestResourceStream("xyz.project.Folder1.Folder2.SomeFile.Txt")
另一种方法是使用 Ressource Data
中的 MemoryStream
:
byte[] aa = Properties.Resources.YOURRESSOURCENAME;
MemoryStream MS =new MemoryStream(aa);
StreamReader sr = new StreamReader(MS);
不理想,但有效
我已经将 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 的解决方案并得到Argument 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 属性
中嵌入资源您无法使用 File.ReadAllText 读取资源文件。
相反,您需要使用 Assembly.GetManifestResourceStream 打开资源流。
您也不向其传递路径,而是向其传递命名空间。文件的命名空间将是程序集默认命名空间 + 文件所在项目中的文件夹继承权 + 文件名。
想象一下这个结构
- 项目(xyz.project)
- 文件夹1
- 文件夹2
- SomeFile.Txt
所以文件的命名空间将是:
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();
}
您好,建议的解决方案不起作用
这个returnnull
:
Assembly.GetExecutingAssembly().GetManifestResourceStream("xyz.project.Folder1.Folder2.SomeFile.Txt")
另一种方法是使用 Ressource Data
中的 MemoryStream
:
byte[] aa = Properties.Resources.YOURRESSOURCENAME;
MemoryStream MS =new MemoryStream(aa);
StreamReader sr = new StreamReader(MS);
不理想,但有效