在F#中调用File.ReadAllBytes方法

时间:2015-03-05 15:25:08

标签: f#

以下是我的代码示例:

let getAllBooks bookDirectory =
    seq {yield! Directory.GetFiles(bookDirectory)}
    |> Seq.map (fun eachFile -> eachFile.ReadAllBytes)

它无法正常工作。怎么了?我该怎么写呢?

1 个答案:

答案 0 :(得分:3)

就像你在标题中所说的那样,该函数被称为File.ReadAllBytes;)

它是System.IO.File类的静态方法,因此必须在File类型上调用,而不是某些实例:

open System.IO

let getAllBooks bookDirectory =
    seq {yield! Directory.GetFiles (bookDirectory) }
    |> Seq.map (fun eachFile -> File.ReadAllBytes eachFile)

顺便说一下,这段代码可以改进,因为GetFiles的结果是一个数组,也是seq

open System.IO

let getAllBooks bookDirectory =
    Directory.GetFiles bookDirectory
    |> Seq.map (fun eachFile -> File.ReadAllBytes eachFile)

此外,您可以直接将ReadAllBytes函数直接传递给map:

open System.IO

let getAllBooks bookDirectory =
    Directory.GetFiles bookDirectory
    |> Seq.map File.ReadAllBytes

最后,如果您愿意,也可以删除函数参数:

open System.IO

let getAllBooks =
    Directory.GetFiles
    >> Seq.map File.ReadAllBytes

评论更新:

  

我还有一个问题:如何将字节数组转换为数字等效字符?

您可以使用System.BitConverter类中的静态方法,例如System.BitConverter.ToInt32

open System

let array = [| 0x00uy; 0x10uy; 0x00uy; 0x00uy |]

BitConverter.ToInt32 (array, 0)
|> printfn "Array as Int32: %d"
// Prints: Array as Int32: 4096

不要忽略那里的ToString方法,它可以将字节数组转换为十六进制字符串:

BitConverter.ToString array
|> printfn "%s"
// Prints: 00-10-00-00

可以找到所有可用的转换方法on MSDN