2

ユーザーの位置を追跡する WP7 アプリがあります。GeoCoordinate ウォッチャーの位置変更イベントで分離ストレージに場所を書き込みたいのですが、「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

私はそれを理解し、同じ問題を抱えている他の誰かのために解決策を提示すると思いました. ストアから 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 に答える
0

コメントで述べたように、私は F#er ではありませんが、C# でこのエラーを数回見ました。「使用」ブロックはそれをうまく解決しました。「use」ブロックを使用している場合でも、「locations.xml」がまだ何かによって開かれているように聞こえるため、そのようなものには「using」ブロックを使用する方が良いとドキュメントは述べています。

次のコードを実行するときは、「使用する」ではなく「使用する」という単語を試してください。

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

ソース

理由に関する重要なハイライトは次のとおりです(上記のリンクから):

using 関数と use バインディングは、同じことを達成するためのほぼ同等の方法です。using キーワードを使用すると、Dispose が呼び出されるタイミングをより詳細に制御できます。using を使用すると、関数またはラムダ式の最後で Dispose が呼び出されます。use キーワードを使用すると、含まれているコード ブロックの最後で Dispose が呼び出されます。一般に、using 関数の代わりに use を使用することをお勧めします。

于 2012-04-16T09:29:15.917 に答える