2016-08-17 3 views
0

Xamarin Android의 MainActivity 클래스에서 .pbf 파일에 액세스하려고합니다. 새 Maps 폴더에 파일을 추가하려고 시도했지만 자산 및 리소스 폴더에 추가하려고했습니다.Xamarin.Android 프로젝트의 파일에서 읽기

다른 빌드 작업으로 설정을 시도했습니다. 그러나이 오류가 항상 생성됩니다 ... "System.IO.FileNotFoundException : 파일을 찾을 수 없습니다"

using (var inputStream = 
    new FileInfo(@"Resources\ireland.osm.pbf").OpenRead()) 
{ 
... 
} 

어떻게 파일이 프로젝트에 추가에서는 FileInfo를 사용하여 액세스해야 하는가?

답변

0

은 첫째로 당신이 아마하고 싶은 사용하는 자산과 파일 시스템에 직접 액세스하는 것처럼 응용 프로그램 나던 동일하게 작동으로이 Tutorial

포함 파일을 따르십시오. 지금 당신은 자산에서 FileInfo을 얻을 수 없을 것이나 당신은 그 (것)들을 읽을 수있을 것이다.

먼저 ireland.osm.pbf 파일을 Assets 디렉토리에 놓습니다. 다음으로해야합니다. (보통 기존 항목 추가을 선택하면 빌드 작업을 AndroidAsset으로 설정해야합니다. 이것은 Android 패키지의 일부로 파일을 빌드 (패키지)합니다.

다음 자산은 AssetManager을 통해로드 (액세스)됩니다. 다행히도 이것은 Activity Context에서 this.Assets을 통해 사용할 수 있습니다.

자산을 읽는 것은 아주 간단합니다.

using (StreamReader sr = new StreamReader (Assets.Open ("ireland.osm.pbf"))) 
{ 
    //do as you wish with the stream reader. 
} 

편집 : 주석에서

. 링크를 다음과 같이

는하지만 난 PBFOsmStreamSource()를 구현하기 위해에서는 FileInfo가 필요

나는 PBFOsmStreamSource()에 대한 소스 코드를 간단히 살펴했다 생성자가

:

/// <summary> 
/// Creates a new source of PBF formated OSM data. 
/// </summary> 
/// <param name="stream"></param> 
public PBFOsmStreamSource(Stream stream) 
{ 
    _stream = stream; 
} 

을 이제 스트림 리더가 이 아닌Stream으로 변환해야합니다. Stream으로 변환해야하지만, 속성은 BaseStream입니다. 이제는 전화 할 수있는 테스트 환경이 없습니다.

using (StreamReader sr = new StreamReader(Assets.Open("ireland.osm.pbf"))) 
{ 
    //do as you wish with the stream reader. 
    var pbfStreamSource = new PBFOsmStreamSource(sr.BaseStream); 

} 

EDIT

방법을 지원하지 않는다. PBFOsmStreamSource의 출처를 자세히 읽으십시오.

private void Initialize() 
{ 
    _stream.Seek(0, SeekOrigin.Begin); 

    this.InitializePBFReader(); 
} 

따라서 귀하는 System.NotSupporte‌​dException 예외가 발생합니다. 따라서 Seek() 메서드를 지원하는 스트림을 만들어야합니다. Fortunatly MemoryStream은 위치를 변경할 수 있으며 Seek() 방법을 지원합니다.

다시 테스트 환경이 없습니다.

using (StreamReader sr = new StreamReader(Assets.Open("ireland.osm.pbf"))) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     sr.BaseStream.CopyTo(ms); 
     var pbfStreamSource = new PBFOsmStreamSource(ms); 
    } 
} 

최종 편집

더 검토 한 결과, 자신의 샘플을보고 난 당신이 모바일에서와 같은 FASION에 StreamReader를 사용하는 예 콘솔 응용 프로그램을 작성했습니다. 이제는 약간 수정하여 StreamReader을 처분 할 수 있습니다.이 파일은 많은 양의 메모리를 소비하므로 한 번에 두 스트림을 모두 열 필요가 없습니다. 다음과 같이

using OsmSharp.Geo; 
using OsmSharp.Osm.PBF.Streams; 
using System; 
using System.IO; 
using System.Linq; 
using System.Net.Http; 
using System.Threading.Tasks; 

namespace Sample.GeometryStream 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test(); 
      Console.ReadLine(); 

     } 
     static async Task Test() 
     { 

      await ToFile("http://files.itinero.tech/data/OSM/planet/europe/luxembourg-latest.osm.pbf", "test.pbf"); 

      var sr = new StreamReader("test.pbf"); 
      using (var ms = new MemoryStream()) 
      { 
       try 
       { 
        sr.BaseStream.CopyTo(ms); 
       } 
       catch 
       { 
        //TODO: Handle exceptions 
       } 
       finally 
       { 
        sr.Close(); 
        sr.Dispose(); 
       } 
       var pbfStreamSource = new PBFOsmStreamSource(ms); 
      } 
     } 

     public static async Task ToFile(string url, string filename) 
     { 
      if (!File.Exists(filename)) 
      { 
       var client = new HttpClient(); 
       using (var stream = await client.GetStreamAsync(url)) 
       using (var outputStream = File.OpenWrite(filename)) 
       { 
        stream.CopyTo(outputStream); 
       } 
      } 
     } 

    } 
} 
+0

)이 나 파일에 액세스 할 수 있습니다하지만 난이 PBFOsmStreamSource을 (구현할에서는 FileInfo가 필요합니다 [링크] (https://github.com/OsmSharp/ui/wiki/A-getting-started -example) – Ruairi

+0

@Rani 응답을 업데이트했습니다. 'StreamReader'의'BaseStream' 속성을보세요 – Nico

+0

당신의 제안을 시도해보십시오. 이 오류가 발생했으나 관련이 없습니다 ... _ {System.NotSupportedException : 지정된 메소드가 지원되지 않습니다. Android.Runtime.InputStreamInvoker.Seek (Int64 오프셋, SeekOrigin 원점) /Users/builder/data/lanes/3415/7db2aac3/source/monodroid/src/Mono.Android/src/Runtime/InputStreamInvoker.cs의 [0x00000] : 0xOsmSharp.Osm.Streams.PBFOsmStreamSource에서 38 Instialize() [파일 이름 알 수 없음] :OsmSharp.Osm.Streams.Filters.OsmStreamFilterTagsFilter.Initialize() [0x00007] in : 0 at OsmSharp.Osm.Streams.OsmStreamTarget.Pull() _ – Ruairi