Me.*_*ose 643 .net streamreader embedded-resource
如何使用嵌入式资源(文本文件)StreamReader并将其作为字符串返回?我当前的脚本使用Windows窗体和文本框,允许用户查找和替换未嵌入的文本文件中的文本.
private void button1_Click(object sender, EventArgs e)
{
StringCollection strValuesToSearch = new StringCollection();
strValuesToSearch.Add("Apple");
string stringToReplace;
stringToReplace = textBox1.Text;
StreamReader FileReader = new StreamReader(@"C:\MyFile.txt");
string FileContents;
FileContents = FileReader.ReadToEnd();
FileReader.Close();
foreach (string s in strValuesToSearch)
{
if (FileContents.Contains(s))
FileContents = FileContents.Replace(s, stringToReplace);
}
StreamWriter FileWriter = new StreamWriter(@"MyFile.txt");
FileWriter.Write(FileContents);
FileWriter.Close();
}
Run Code Online (Sandbox Code Playgroud)
dtb*_*dtb 1126
您可以使用Assembly.GetManifestResourceStream方法:
添加以下用法
using System.IO;
using System.Reflection;
Run Code Online (Sandbox Code Playgroud)设置相关文件的属性:带有值的
参数Build ActionEmbedded Resource
使用以下代码
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "MyCompany.MyProduct.MyFile.txt";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
string result = reader.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)
resourceName是嵌入的资源之一的名称assembly.例如,如果您嵌入了一个名为的文本文件"MyFile.txt",该文件位于具有默认命名空间的项目的根目录中"MyCompany.MyProduct",那么resourceName就是"MyCompany.MyProduct.MyFile.txt".您可以使用Assembly.GetManifestResourceNamesMethod获取程序集中所有资源的列表.
没有必要resourceName从文件名中获取(通过传递名称空间的东西):
string resourceName = assembly.GetManifestResourceNames()
.Single(str => str.EndsWith("YourFileName.txt"));
Run Code Online (Sandbox Code Playgroud)
Con*_*ngo 130
您可以使用两个单独的方法将文件添加为资源.
访问文件所需的C#代码是不同的,具体取决于首先添加文件的方法.
Embedded Resource将文件添加到项目中,然后将类型设置为Embedded Resource.
注意:如果使用此方法添加文件,则可以使用GetManifestResourceStream它来访问它(请参阅@dtb中的答案).

Resources.resx打开Resources.resx文件,使用下拉框添加文件,设置Access Modifier为public.
注意:如果使用此方法添加文件,则可以使用Properties.Resources它来访问它(请参阅@Night Walker的答案).

Chr*_*nte 85
请查看此页面:http://support.microsoft.com/kb/319292
基本上,您System.Reflection用来获取当前程序集的引用.然后,你使用GetManifestResourceStream().
例如,从我发布的页面:
注意:需要为此添加using System.Reflection;才能工作
Assembly _assembly;
StreamReader _textStreamReader;
try
{
_assembly = Assembly.GetExecutingAssembly();
_textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
}
catch
{
MessageBox.Show("Error accessing resources!");
}
Run Code Online (Sandbox Code Playgroud)
And*_*ill 69
在Visual Studio中,您可以通过Project属性的Resources选项卡直接嵌入对文件资源的访问(本例中为"Analytics").

然后,生成的文件可以作为字节数组来访问
byte[] jsonSecrets = GoogleAnalyticsExtractor.Properties.Resources.client_secrets_reporter;
Run Code Online (Sandbox Code Playgroud)
如果您需要它作为流,那么(来自/sf/answers/331532981/)
Stream stream = new MemoryStream(jsonSecrets)
Run Code Online (Sandbox Code Playgroud)
Nig*_*ker 27
将文件添加到资源时,应将其"访问修饰符"选择为公开,而不是像下面这样进行操作.
byte[] clistAsByteArray = Properties.Resources.CLIST01;
Run Code Online (Sandbox Code Playgroud)
CLIST01是嵌入文件的名称.
实际上你可以去resources.Designer.cs看看getter的名字是什么.
mic*_*y89 13
添加例如Testfile.sql项目菜单 - >属性 - >资源 - >添加现有文件
string queryFromResourceFile = Properties.Resources.Testfile.ToString();
Run Code Online (Sandbox Code Playgroud)
小智 12
我知道这是一个旧线程,但这对我有用:
阅读这样的文字:
textBox1 = new TextBox();
textBox1.Text = Properties.Resources.SomeText;
Run Code Online (Sandbox Code Playgroud)我添加到资源的文本:'SomeText.txt'
你也可以使用这个简化版的@ dtb的答案:
public string GetEmbeddedResource(string ns, string res)
{
using (var reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format("{0}.{1}", ns, res))))
{
return reader.ReadToEnd();
}
}
Run Code Online (Sandbox Code Playgroud)
通过您的全部力量,我使用此帮助程序类以通用方式从任何程序集和任何名称空间中读取资源。
public class ResourceReader
{
public static IEnumerable<string> FindEmbededResources<TAssembly>(Func<string, bool> predicate)
{
if (predicate == null) throw new ArgumentNullException(nameof(predicate));
return
GetEmbededResourceNames<TAssembly>()
.Where(predicate)
.Select(name => ReadEmbededResource(typeof(TAssembly), name))
.Where(x => !string.IsNullOrEmpty(x));
}
public static IEnumerable<string> GetEmbededResourceNames<TAssembly>()
{
var assembly = Assembly.GetAssembly(typeof(TAssembly));
return assembly.GetManifestResourceNames();
}
public static string ReadEmbededResource<TAssembly, TNamespace>(string name)
{
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
return ReadEmbededResource(typeof(TAssembly), typeof(TNamespace), name);
}
public static string ReadEmbededResource(Type assemblyType, Type namespaceType, string name)
{
if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
if (namespaceType == null) throw new ArgumentNullException(nameof(namespaceType));
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
return ReadEmbededResource(assemblyType, $"{namespaceType.Namespace}.{name}");
}
public static string ReadEmbededResource(Type assemblyType, string name)
{
if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
var assembly = Assembly.GetAssembly(assemblyType);
using (var resourceStream = assembly.GetManifestResourceStream(name))
{
if (resourceStream == null) return null;
using (var streamReader = new StreamReader(resourceStream))
{
return streamReader.ReadToEnd();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我刚刚学到的一点是你的文件不允许有"." (点)在文件名中.

Templates.plainEmailBodyTemplate-en.txt - > Works !!!
Templates.plainEmailBodyTemplate.en.txt - >不能通过GetManifestResourceStream()工作
可能是因为框架在名称空间与文件名之间混淆了......
我知道这是旧的,但我只是想指出NETMF(.Net MicroFramework),你可以很容易地做到这一点:
string response = Resources.GetString(Resources.StringResources.MyFileName);
Run Code Online (Sandbox Code Playgroud)
由于NETMF没有GetManifestResourceStream
某些 VS .NET 项目类型不会自动生成 .NET (.resx) 文件。以下步骤将资源文件添加到您的项目中:
\n\nResources.现在您可以添加文本文件作为资源,例如 xml 文件:
\n\nResources具有一个string以包含的文件命名的 type 属性。如果文件名为 RibbonManifest.xml,则该属性的名称应为RibbonManifest。您可以在代码文件 Resources.Designer.cs 中找到确切的名称。string xml = Resources.RibbonManifest。一般形式为ResourceFileName.IncludedTextFileName. 不要使用\xe2\x80\x99 ResourceManager.GetString,因为字符串属性的 get 函数已经做到了这一点。| 归档时间: |
|
| 查看次数: |
529452 次 |
| 最近记录: |