2

我有一个跟踪用户位置的 WP7 应用程序。一切正常,除了我想在 GeoCoordinate 观察者的位置更改事件上将位置写入隔离存储,并且我不断收到“Operation Not Permitted on IsolatedStorageFileStream”消息。任何人都可以帮助让它工作吗?

将坐标保存到文件的成员是:

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
4

2 回答 2

0

正如我在评论中提到的,我不是 F#er,但我在使用 C# 时曾多次看到此错误。“使用”块很好地解决了它。即使您使用的是“使用”块,文档说最好使用“使用”块来处理类似的事情,因为听起来“locations.xml”仍然被某些东西打开。

当您运行以下代码时,请尝试使用“使用”一词而不是“使用”:

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

来源

这是为什么(来自上面的链接)的重要亮点:

using 函数和 use 绑定是完成同一件事的几乎等效的方法。using 关键字提供了对何时调用 Dispose 的更多控制。使用 using 时,会在函数或 lambda 表达式的末尾调用 Dispose;当您使用 use 关键字时,会在包含代码块的末尾调用 Dispose。通常,您应该更喜欢使用 use 而不是 using 函数。

于 2012-04-16T09:29:15.917 回答
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
于 2012-04-16T14:33:50.660 回答