我的项目文件资源管理器中有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();
}
}
Run Code Online (Sandbox Code Playgroud)
使用此代码块,流始终为空.这是项目文件资源管理器:
我从其属性中选择文本文件作为嵌入式资源.
小智 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();
}
}
Run Code Online (Sandbox Code Playgroud)
参考Xamarin.Forms:在共享项目中加载嵌入资源的文件
我终于找到了解决方案。这不是解决问题的好方法,但它确实有效。我的问题是给出文本文件的路径不起作用。程序无法读取文本文件。但是使用这段代码,程序本身会找到文本文件的路径并使用它。
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])
});
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)