2012-04-16 95 views
2

我有一個跟蹤用戶位置的WP7應用程序。所有工作都很好,除了我想將位置寫入GeoCoordinate監視器的位置更改事件上的隔離存儲器,並且我一直收到「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 2012-04-16 09:20:31

+0

你沒有處理'IsolatedStorageFileStream'實例。嘗試用'use file = ...'替換'let file = ...'。 – pad 2012-04-16 10:50:26

回答

0

正如我在評論中提到的,我不是一個F#呃,可是我幾次看到這個錯誤與C#。 「使用」塊很好地解決了它。儘管您使用的是「使用」塊,但文檔說,使用「使用」塊來處理類似事情會更好,因爲聽起來像「locations.xml」仍然是由某些東西打開的。

嘗試 「使用」 而不是 「用」 當您運行下面的代碼字:

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

Source

這裏是重要的亮點,爲什麼(從上面的鏈接):

的使用功能和使用結合幾乎等同的方式來完成同樣的事情。使用關鍵字可以更好地控制何時調用Dispose。當你使用using時,在函數或lambda表達式的末尾調用Dispose;當您使用use關鍵字時,在包含代碼塊的末尾調用Dispose。一般來說,您應該更喜歡使用use而不是using函數。

+0

以及我嘗試了'使用'而不是'let'的建議,現在我已經創建了該文件,但遇到應用程序無法打開文件的錯誤。我已經檢查過IsolatedStorage,並且確定location.xml存在於根目錄中,但無法打開!也許我在代碼的「其他」部分缺少一些東西? – Sonya 2012-04-16 10:56:00

+0

我的建議是改變'使用'到'使用',我沒有說'讓',墊說:) :) – Eugene 2012-04-16 11:24:53

+0

似乎文件正在寫入IsolatedStorage,但試圖在創建後更新文件,文檔聲明再次被添加,拋出一個XML異常。任何任何想法?我試過在更新前刪除文件,但我得到一個IsolatedStorage異常,無法訪問商店:( – Sonya 2012-04-16 12:43:34

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