System.IO 命名空间的主要目的是为了提供方便访问操作系统的文件和目录类型,另外,也提供写内存和网络流的方法。
这个命名空间提供主要两种方法处理文件和目录,能够使用FileInfo 和 DirectoryInfo 对象获得或修改文件和目录的信息;也能够用File 和 Directory 类实现相同的功能,但是两者都要求传入的文件名为静态成员。通常,如果想要获得文件系统对象的某一项信息,用 File 和 Directory 类;如果想要获得一个文件系统对象的多项信息,用 FileInfo 和 DirectoryInfo 类。两者也是互补的。例如,可以先用 Directory 类型获得目录中所有文件的信息,再用 FileInfo
对象获得文件的名字和其他信息。看下面的例子是如何做的:
open System.IO
// list all the files in the root of C:drive
let files =Directory.GetFiles(@"c:\")
// write out various information about thefile
for filepath in files do
let file = new FileInfo(filepath)
printfn "%s\t%d\t%O"
file.Name
file.Length
file.CreationTime
运行结果如下(不同的机器会有不同的结果):
addadmin.bat 95 ? 01/10/2003 02:08:10
ATTDialer.doc 297472 03/11/2003 20:12:54
AUTOEXEC.BAT 0 12/05/2003 20:21:21
avapower.gif 1056 07/07/2004 01:27:05
boot.ini 211 12/05/2003 12:58:01
CONFIG.SYS 0 12/05/2003 20:21:21
dpst.bat 17 01/10/2003 02:08:10
imagefaq.bat 21 01/10/2003 02:08:10
IO.SYS 0 12/05/2003 20:21:22
MSDOS.SYS 0 12/05/2003 20:21:22
NTDETECT.COM 47564 23/08/2001 14:00:00
Ntldr 250032 23/08/2001 14:00:00
这个命名空间还能非常方便地处理文件内容。F# 中的文件以流的形式打开和表示文件,因此,读写文件的方法可以是字节、字符或字符串。打开文件并从中读出文本,不可能更简单了,只要调用 File. ReadAllLines 方法,就返回一个数组,其中包含了文件中的所有行。下面的例子演示了如何读取以逗号分隔的文件文件,有三列数据:
open System.IO
//test.csv:
//Apples,12,25
//Oranges,12,25
//Bananas,12,25
// open a test file and print the contents
let readFile() =
let lines =File.ReadAllLines("test.csv")
let printLine (line: string) =
let items = line.Split([|‘,‘|])
printfn "%O %O %O"
items.[0]
items.[1]
items.[2]
Seq.iter printLine lines
do readFile()
执行前面的代码,处理注释中的文本文件,结果如下:
Apples 12 25
Oranges 12 25
Bananas 12 25
注意
File. ReadAllLines 方法假设文件是以UTF-8 编码的,如果文件没有使用这个文本编码,应该用方法的另一个重载,传入适当的编码对象。例如,如果文件使用的是西欧语言的 Windows-1252 编码,打开的方法应该是:
File.ReadAllLines("accents.txt"),Encoding.GetEncoding(1252))。