F#PCL和System.IO.FileStream

时间:2014-07-23 14:43:21

标签: f#

我正在使用F#编写PCL,我正在尝试将某些内容写入磁盘。所有PCL示例都在VB.NET和C#中,这些示例在F#中不起作用。具体来说,我有这个代码:

type FileSystemStockProvider(filePath:string) =
    member this.PutData(stockData) =
        let serializedData = stockData 
                                |> Seq.map(fun row -> JsonConvert.SerializeObject(row))
        let outFile = new System.IO.StreamWriter(filePath)
        outFile.Write(serializedData)

问题是F#中的System.IO.StreamWriter没有磁盘重载,因此无法编译。有没有人建议如何使用PCL写入磁盘?

提前致谢

1 个答案:

答案 0 :(得分:2)

确认,您正在寻找的超载缺失。但是,我不认为这是一个错误,因为它在.net框架中缺少C#和F#。这不是F#特有的。我期望的原因是因为不同移动和跨平台设备上的沙箱要求。因此,我们习惯使用的Windows / Linux路径名称不再普遍适用。

https://pclstorage.codeplex.com/。使用Nuget检索

为了减少getFileStream中的步骤数,可能还有一些空间可以在ac:\或\\ networkPath中进行一些字符串解析,甚至是基于url的aRootWithAFewReservedWords:// / path / to / the / file.json那种方式。

btw:在代码中处理文件流时出现问题。您需要明确并使用use / using / dispose技术之一。你绝对没有看到过载吗?

namespace PortableLibrary1

open Newtonsoft.Json

[<JsonObject>]
type TestType() =
    [<JsonProperty>]
    member val Property2 = "testData" with get, set

type FileSystemStockProvider(filePath:string) =

    //let getFileStream folder file = 
    //    // for windows / linux?
    //    new System.IO.StreamWriter("c:\\" + folder + "\\" + filePath)   

    let getFileStream folder file = 
         let rootFolder =  PCLStorage.FileSystem.Current.LocalStorage
         let folder = rootFolder.CreateFolderAsync(folder,PCLStorage.CreationCollisionOption.OpenIfExists).Result
         let file = folder.CreateFileAsync(file, PCLStorage.CreationCollisionOption.ReplaceExisting).Result
         file.OpenAsync(PCLStorage.FileAccess.ReadAndWrite).Result

    member __.PutData(stockData) =
        let fs = getFileStream "theFolder" "theFile.json"
        use outFile = new System.IO.StreamWriter(fs)
        stockData |> Seq.iter (JsonConvert.SerializeObject >> outFile.Write)