2017-12-31 188 views
1

私のプロジェクトファイルエクスプローラにdata.txtファイルがあります。私はこのテキストファイルからデータを読み込みたいですが、試してみるたびに結果はnullになり、プログラムがクラッシュします。私が書いたコードは次のとおりです。Xamarinフォームのテキストファイルからの読み込み結果が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

+0

https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/files/#Embedding_in_Shared_Projects – Nkosi

答えて

0

私は解決策をついに発見しました。それを解決する良い方法ではありませんが、それは動作します。私の問題は、テキストファイルのパスが機能していないことを示していました。プログラムがテキストファイルを読み取れませんでした。しかし、このコードを使用すると、プログラム自体がテキストファイルのパスを見つけてそれを使用します。

共有プロジェクトで特異的に埋め込まれたリソースに関するドキュメントでこれを見つけた
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]) 
        }); 
       } 
      } 
     } 
    } 
} 
3

としては、以下で参照文書を通じて指摘し、あなたが持っているコードは、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 : Loading Files Embedded as Resources in Shared Projects

+0

このコードは、私のために働いていません。ストリームはまだヌルになっています。 – esdoodle

関連する問題