从C#资源中读取文本文件

24

我需要从我的资源中读取一个文件并将其添加到列表中。 我的代码:

private void Form1_Load(object sender, EventArgs e)
{
    using (StreamReader r = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("myProg.myText.txt")))
    {
        //The Only Options Here Are BaseStream & CurrentEncoding
    }
}

我搜索了这个问题,但只找到了像"Assembly.GetExecutingAssembly...."这样的答案,但我的程序没有Assembly选项?


1
你在页面顶部添加了 using System.Reflection; 吗? - keyboardP
1
你遇到了什么问题? - Patrick
我读到这个可以工作:New StreamReader(Assembly.GetExecutingAssembly.GetNamedResourceStream("[程序命名空间].Thresh Dress.txt")) - Dobz
但它没有.GetNamedResourceStream选项。 - Dobz
确保在输入命名空间时使用下划线而不是空格。如果您仍需要澄清,请向代码顶部滚动到命名空间所在位置,确切地使用那里所示的命名空间。 - Austin Peters
4个回答

41

尝试像这样:

string resource_data = Properties.Resources.test;
List<string> words = resource_data.Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries).ToList();

哪里

enter image description here


我很久以前就做过这个,而且效果非常好。我将代码复制到一个新项目中,现在出现了错误,“名称属性不存在”。这个解决方案需要任何库或软件包吗? - Joe

11

为了访问程序集,您需要在头文件中包含using System.Reflection;。这仅适用于在VS中将文件标记为“嵌入式资源”的情况。

var filename = "MyFile.txt"
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("YourNameSpace." + filename));
只要您包括 'using System.Reflection;',就可以像这样访问Assembly:

Assembly.GetExecutingAssembly().GetManifestResourceStream("YourNamespace." + filename);

或者,如果您不需要更改文件名,只需使用以下命令:

Assembly.GetExecutingAssembly().GetManifestResourceStream("YourNamespace.MyFile.txt");

完整的代码应该是这样的:

using(var reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("myProg.m‌​yText.txt"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        // Do some stuff here with your textfile
    }
}

1
StreamReader reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("myProg.myText.txt")) { 这里唯一的选项是BaseStream和CurrentEncoding }; - Dobz
你使用的是哪个版本的 .net?你是说 reader 只有 reader.BaseStreamreader.CurrentEncoding 吗? - Pete Garafano
版本4?是的,只有这个出现了吗? - Dobz
我无法回答为什么您缺少所有方法。您似乎只能使用可用的属性。即使IDE不满意您对这些方法的调用,您也可以尝试编译它吗?您还可以尝试清理项目并重新启动VS。 - Pete Garafano

3

继续讲,AppDeveloper方案是正确的选择。

string resource_data = Properties.Resources.test;
string [] words = resource_data.Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
foreach(string lines in words){
.....
}

1
        [TestCategory("THISISATEST")] 
        public void TestResourcesReacheability() 
        { 
            byte[] x = NAMESPACE.Properties.Resources.ExcelTestFile; 
            string fileTempLocation = Path.GetTempPath() + "temp.xls"; 
            System.IO.File.WriteAllBytes(fileTempLocation, x);   

            File.Copy(fileTempLocation, "D:\\new.xls"); 
        }

你将以字节数组形式获得资源文件,因此可以使用WriteAllBytes创建新文件。如果不知道在哪里写入文件(由于权限和访问问题),可以使用Path.GetTempPath()使用PC临时文件夹写入新文件,然后可以从那里复制或进行操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接