Xamarin Forms从文本文件读取结果为空

5

我在项目文件浏览器中有一个data.txt文件。我想从这个文本文件中读取数据,但每次尝试时,结果都为null并且程序崩溃。我编写的代码是:

public MapPage()
{
    var assembly = typeof(MapPage).GetTypeInfo().Assembly;
    Stream stream = assembly.GetManifestResourceStream("Mapper.data.txt");

    string text = "";
    using (var reader = new System.IO.StreamReader(stream))
    {
        text = reader.ReadToEnd();
    }
}

使用这个代码块,流永远为 null。以下是项目文件资源管理器:

Project file explorer

我从属性中选择文本文件作为嵌入式资源。

Embedded Resource


在文档中找到了关于共享项目中嵌入资源的特定信息:https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/files/#Embedding_in_Shared_Projects - Nkosi
2个回答

5

如下文档所指出的那样,您拥有的代码适用于PCL/.NET标准项目。如果您使用的是共享项目类型,则必须通过前缀来针对设备类型进行目标定位,例如Mapper.IOS、Mapper.Droid等。

我已经测试了这两种情况,并且它们都可以使用您在问题中提到的相同代码,在共享项目类型中使用IOS、Droid等前缀。

public MainPage()
{
    #if __IOS__
    var resourcePrefix = "Mapper.iOS";
    #endif
    #if __ANDROID__
    var resourcePrefix = "Mapper.Droid";
    #endif
    #if WINDOWS_PHONE
    var resourcePrefix = "Mapper.WinPhone";
    #endif

    var assembly = typeof(MainPage).GetTypeInfo().Assembly;
    Stream stream = assembly.GetManifestResourceStream($"{resourcePrefix}.data.txt");
    string text = "";

    using (var reader = new System.IO.StreamReader(stream))
    {
        text = reader.ReadToEnd();
    }
}

参考 Xamarin.Forms:在共享项目中加载作为资源嵌入的文件


这个代码对我来说不起作用。流仍然为空。 - esdoodle

3

我终于找到了解决方案。虽然不是最好的方法,但它确实有效。我的问题是提供文本文件路径无法正常工作。程序无法读取文本文件。但是使用此代码,程序自己找到文本文件的路径并使用它。

private void LoadData()
{
    var assembly = typeof(MapPage).GetTypeInfo().Assembly;
    foreach (var res in assembly.GetManifestResourceNames())
    {
        if(res.Contains("data.txt"))
        {
            Stream stream = assembly.GetManifestResourceStream(res);

            using (var reader = new StreamReader(stream))
            {
                string data = "";
                while((data = reader.ReadLine()) != null)
                {        
                    var array = data.Split(' ');
                    dataArray.Add(new SensorModel()
                    {
                        left = Convert.ToInt32(array[0]),
                        right = Convert.ToInt32(array[1]),
                        front = Convert.ToInt32(array[2])
                    });
                }
            }
        }
    }
}

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