2012-04-16 1 views
2

사용자의 위치를 ​​추적하는 WP7 앱이 있습니다. GeoCoordinate 와쳐의 위치 변경 이벤트에서 격리 된 저장소에 위치를 쓰고 싶습니다. "Operation Not Permitted on IsolatedStorageFileStream"메시지가 계속 나타납니다. 누구든지이 일을하도록 도울 수 있습니까?F # windows 전화 및 스토리지 격리 된 XML

let xname n = XName.op_Implicit(n) 
let xdoc (el: seq<XElement>) = new XDocument(Array.map box (Array.ofSeq el)) 
let xelem s el = new XElement(xname s, box el) 
let xstr s = box s 


member this.createLocationsFile latitude longitude = 
    try 
       let doc : XDocument = 
         xdoc 
          [xelem "root" 
           [xelem "location" 
            [(xelem "latitude" (xstr latitude)) 
            (xelem "longitude" (xstr longitude)) 
            ] 
           ] 
          ]      
       use store = IsolatedStorageFile.GetUserStoreForApplication()     
       if not (store.FileExists("locations.xml")) then 
        let file = new IsolatedStorageFileStream("locations.xml", IO.FileMode.Create, store)     
        doc.Save(file) 
       else 
        let file = new IsolatedStorageFileStream("locations.xml", IO.FileMode.Open, store) 
        let docAmended : XDocument = XDocument.Load(file) 
        let elementToAdd = 
         docAmended.Element(xname "root").Add(
          [xelem "location" 
           [(xelem "latitude" (xstr latitude)) 
           (xelem "longitude" (xstr longitude)) 
           ] 
          ]) 
        docAmended.Save(file) 
    with 
     | :? IsolatedStorageException as ex -> MessageBox.Show("Error saving file: " + ex.Message) |> ignore 
      | _ -> MessageBox.Show("Unable to open file") |> ignore 

그리고 PositionChangedEventHandler은 다음과 같습니다 :

파일에 좌표를 저장하는 멤버는

let MyPositionChanged(e : GeoPositionChangedEventArgs<GeoCoordinate>, map : Map, ellipse : Ellipse) = 
    let ppLoc = new GeoCoordinate(e.Position.Location.Latitude, e.Position.Location.Longitude) 
    map.SetView(ppLoc, 10.0) 
    //do layer.AddChild(ellipse, ppLoc) 
    ellipse.Visibility <- System.Windows.Visibility.Visible 
    let iso = new IsolatedStorageHelper() 
    let lat = ppLoc.Latitude.ToString() 
    let lon = ppLoc.Longitude.ToString() 
    do iso.createLocationsFile lat lon 
+0

파일을 격리 된 저장소에 보관하는 중 오류가 발생합니다. createLocationsFile 이벤트의 if 및 else 케이스에서 파일 핸들을 처리 할 수 ​​있는지 확인하십시오. 불행히도, 나는 F # 어, 미안 해요,하지만 그게 내가 C#을 코드에서 검사 할거야. – Eugene

+0

당신은'IsolatedStorageFileStream' 인스턴스를 처리하지 않았습니다. 'let file = ...'을'use file = ...'로 바꾸어보세요. – pad

답변

0

내가 코멘트에서 언급 한 바와 같이, 나는 F 번호 어 아니지만, I 이 오류는 C#으로 두 번 보았습니다. "using"블록은 그것을 훌륭하게 해결했습니다. "사용"블록을 사용하고 있지만 문서에서는 "locations.xml"이 여전히 무언가에 의해 열려 있기 때문에 "using"블록을 사용하는 것이 더 낫다고 말합니다.

  ... 
      ]      
      use store = IsolatedStorageFile.GetUserStoreForApplication()     
      if not (store.FileExists("locations.xml")) then 
      ... 

Source :

는 대신 다음과 같은 코드를 실행하면 "사용" "사용"이라는 단어를 사용해보십시오.

은 USING 기능과 바인딩을 사용하여 동일한 일을 수행하기 위해 거의 동등한 방법은 :

여기 (위의 링크) 이유에 중요한 하이라이트이다. using 키워드를 사용하면 Dispose가 호출되는 시점을보다 세부적으로 제어 할 수 있습니다. using을 사용하면 함수 또는 람다 식의 끝에서 Dispose가 호출됩니다. use 키워드를 사용하면 Dispose가 포함 된 코드 블록의 끝에 호출됩니다. 일반적으로 using 함수 대신 use를 사용하는 것이 좋습니다.

+0

음 'let'대신 'use'에 대한 제안을 시도했지만, 지금 파일을 만들었지 만 응용 프로그램이 파일을 열 수 없다는 오류가 발생합니다. IsolatedStorage를 확인한 결과, locations.xml이 루트 디렉토리에 있지만 오픈 할 수는 없습니다. 어쩌면 코드의 'else'섹션에 뭔가 빠져있을 수 있습니까? – Sonya

+0

제 제안은 '사용'을 '사용'으로 바꾸는 것에 관한 것이 었습니다. 패드에 대해 말하지 않았습니다. – Eugene

+0

파일이 IsolatedStorage에 기록 된 것 같지만 생성 후 파일을 업데이트하려고 할 때, 문서 선언이 다시 추가되어 XML 예외가 발생합니다. 누구든지 어떤 아이디어? 업데이트하기 전에 파일을 삭제하려고 시도했지만 IsolatedStorage 예외가 발생하여 저장소에 액세스 할 수 없습니다. – Sonya

0

나는 그것을 알아내어 동일한 문제가있는 다른 사람들을 위해 해결책을 제시 할 것이라고 생각했습니다. 저장소에서 XML을로드하고 파일을 삭제 한 다음 '사용'블록을 닫고 XML을 수정하고 FileMode.Create에서 파일 저장소를 다시 열고 수정 된 XML을 저장소에 다시 저장해야했습니다. 다음은 해결 방법입니다. 내게 도움을 주신 모든 분들께 감사드립니다. :

let xname n = XName.op_Implicit(n) 
let xdoc (el: seq<XElement>) = new XDocument(Array.map box (Array.ofSeq el)) 
let xelem s el = new XElement(xname s, box el) 
let xstr s = box s 


member this.createLocationsFile latitude longitude = 
    try          
       use store = IsolatedStorageFile.GetUserStoreForApplication()     
       if not (store.FileExists("locations.xml")) then 
        use file = new IsolatedStorageFileStream("locations.xml", IO.FileMode.OpenOrCreate, store) 
        let doc = 
         xdoc 
          [xelem "root" 
           [xelem "location" 
            [(xelem "latitude" (xstr latitude)) 
            (xelem "longitude" (xstr longitude)) 
            ] 
           ] 
          ]     
        doc.Save(file) 

       else 
        use store = IsolatedStorageFile.GetUserStoreForApplication() 
        use file = new IsolatedStorageFileStream("locations.xml", IO.FileMode.Open, store) 
        let docAmended : XDocument = XDocument.Load(file) 
        file.Close() 
        store.DeleteFile("locations.xml") 
        use file = new IsolatedStorageFileStream("locations.xml", IO.FileMode.Create, store) 
        do 
         docAmended.Element(xname "root").Add(
          [xelem "location" 
           [(xelem "latitude" (xstr latitude)) 
           (xelem "longitude" (xstr longitude)) 
           ] 
          ]) 

        docAmended.Save(file) 


    with 
     | :? IsolatedStorageException as ex -> MessageBox.Show("Error saving file: " + ex.Message) |> ignore