我正在使用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写入磁盘?
提前致谢
答案 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)