Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#PCL和System.IO.FileStream_F# - Fatal编程技术网

F#PCL和System.IO.FileStream

F#PCL和System.IO.FileStream,f#,F#,我正在用F#编写一个PCL,并且我正在尝试将一些东西写入磁盘。所有的PCL示例都在VB.NET和C中,而这些示例在F中不起作用。具体而言,我有以下代码: type FileSystemStockProvider(filePath:string) = member this.PutData(stockData) = let serializedData = stockData |> Seq.map(fu

我正在用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写入磁盘有什么建议吗


提前感谢

确认,您要查找的过载丢失了。然而,我不认为这是一个错误,因为C#和F#的.net框架中缺少它。这不是F#specific。我预期的原因是因为不同移动和跨平台设备上的沙盒要求。因此,我们使用的Windows/Linux路径名不再普遍适用

看。使用Nuget检索

为了减少getFileStream中的步骤数,在c:\或\\networkPath中,甚至在基于url的ArootWithEwreservedw中,可能有一些空间来进行一些字符串解析ords://the/path/to/the/file.json 有点像

顺便说一句:在代码中处理文件流时出现问题。您需要显式地使用use/use/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)
命名空间可移植库1
打开Newtonsoft.Json
[]
类型TestType()=
[]
带有get、set的成员val Property2=“testData”
键入FileSystemStockProvider(文件路径:字符串)=
//让getFileStream文件夹文件=
////对于windows/linux?
//新System.IO.StreamWriter(“c:\\”+文件夹+“\\”+文件路径)
让getFileStream文件夹文件=
让rootFolder=PCLStorage.FileSystem.Current.LocalStorage
让folder=rootFolder.CreateFolderAsync(文件夹,PCLStorage.CreationCollisionOption.OpenIfExists)。结果
让file=folder.CreateFileAsync(文件,PCLStorage.CreationCollisionOption.ReplaceExisting).Result
file.OpenAsync(PCLStorage.FileAccess.ReadAndWrite).Result
成员PutData(stockData)=
让fs=getFileStream“theFolder”“theFile.json”
使用outFile=new System.IO.StreamWriter(fs)
stockData |>Seq.iter(JsonConvert.SerializeObject>>outFile.Write)

也许我没有遵循,但是您在C#中看到的
StreamWriter与在F#中看到的是相同的(具有相同的重载等)。你的代码。那把小提琴的目标是4.5。在PCL中,据我所知,该过载不可用。对于Windows应用商店应用,请查看。您应该做一些eta降低;):
stockData |>Seq.iter(JsonConvert.SerializeObject>>outFile.Write)
@CarstenKönig:包括你的建议你在PCL中这样做了吗?@JamieDixon:我使用FSI犯了一个错误。上面提供了使用PCLStorage的更正。98%的更改在getFileStream中。