我对F#很新,所以请保持温柔.我试图用函数式编写代码来查看过去5天内修改过的所有文件的目录(和子目录),然后对这些文件执行某些操作(此时只是将名称写入控制台) .
我的代码是:
open System.IO
let rec getAllFiles dir pattern =
seq { yield! Directory.EnumerateFiles(dir, pattern)
for d in Directory.EnumerateDirectories(dir) do
yield! getAllFiles d pattern }
let printMe x = printfn "%A" x
let hasChangedRecently fileName =
let myFile = System.IO.FileInfo(fileName)
let f myFile = function
| myFile when myFile.LastWriteTime >= System.DateTime.Parse "10-04-2015" -> printMe MyFile.Name
| _ -> ()
f fileName
[<EntryPoint>]
let main argv =
getAllFiles @"c:\temp" "*.xml"
|> Seq.iter hasChangedRecently
System.Console.ReadKey() |> ignore
0 // return an integer exit code
Run Code Online (Sandbox Code Playgroud)
hasChangedRecently块中出错了.
错误是:
myFile.LastWriteTime
Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved.
MyFile.Name
The namespace or module 'MyFile' is not defined
|> Seq.iter hasChangedRecently
Type mismatch. Expecting a
string -> unit
but given a
string -> 'a -> unit
The type 'unit' does not match the type ''a -> unit'
Run Code Online (Sandbox Code Playgroud)
我很确定这些是基本的错误,但会真诚地感谢一些指导.
我想改变的hasRecentlyChanged
是string -> bool
功能和过滤器,它的文件,然后有一个单独的功能打印文件.
let hasChangedRecently fileName =
let myFile = System.IO.FileInfo(fileName)
myFile.LastWriteTime >= System.DateTime.Parse "10-04-2015"
let printFile file =
printfn "%s" file
Run Code Online (Sandbox Code Playgroud)
并在main
:
getAllFiles @"c:\temp" "*.xml"
|> Seq.filter hasChangedRecently
|> Seq.iter printFile
Run Code Online (Sandbox Code Playgroud)
此外,如果您愿意,可以getAllFiles
通过使用SearchOption.AllDirectories
内置的.NET 来避免递归:
Directory.EnumerateFiles(dir, pattern, SearchOption.AllDirectories)
Run Code Online (Sandbox Code Playgroud)