#! /usr/bin/env fan
//
// Copyright (c) 2007, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 23 Jul 07 Brian Frank Creation
// 08 Sep 09 Brian Frank Rework fandoc -> example
//
**
** Working with sys::File
**
class Files
{
File temp := Env.cur.tempDir
Void main()
{
constructors
naming
dirs
textIO
binaryIO
objIO
}
Void constructors()
{
echo("\n--- constructors ---")
// construct from Uri
show(File.make(`dir/foo.txt`), "File.make(Uri) longhand")
show(File(`dir/foo.txt`), "File.make(Uri) shorthand")
show(`dir/foo.txt`.toFile, "Uri.toFile")
// construct from OS specific path
show(File.os("bin\\command.exe"), "File.os")
show(File.os("bin" + File.sep + "command.exe"), "File.os with separator")
// construct File instance against base directory
dir := `/somedir/`.toFile
show(dir + `foo.txt`, "/somedir/foo.txt")
show(dir + `subdir/foo.txt`, "/somedir/subdir/foo.txt")
show(dir + `../foo.txt`, "/foo.txt")
}
Void naming()
{
echo("\n--- naming ---")
f := `/files/today/foo.txt`.toFile
show(f.uri, "/files/today/foo.txt")
show(f.path, "[files, today, foo.txt]")
show(f.pathStr, "/files/today/foo.txt")
show(f.name, "foo.txt")
show(f.basename, "foo")
show(f.ext, "txt")
show(f.parent.path, "[files, today]")
show(f.osPath, "\\files\\today\\foo.txt")
}
Void dirs()
{
echo("\n--- dirs ---")
// check if file is a directory
dir := Env.cur.homeDir
show(dir.isDir, "dir.isDir")
// list all files in a directory (files and dirs)
show(dir.list, "dir.list")
// list file names in a directory
show(dir.list.map |f->Str| { f.name }, "dir.list mapped to names")
// get sub directories (filter out files)
show(dir.list.findAll |f| { f.isDir }, "list sub-directories hard way")
show(dir.listDirs, "list sub-directories easy way")
// get child files (filter out sub directories)
show(dir.list.findAll |f| { !f.isDir }, "list child files hard way")
show(dir.listFiles, "list child files easy way")
// create directory (uri must end in / slash)
testDir := temp + `testdir/`
testDir.create
show(testDir, "create directory")
}
Void textIO()
{
echo("\n--- text IO ---")
f := temp + `text-io.txt`
show(f, "creating text file")
// write text file (overwrites existing)
f.out.printLine("hello").close
// append to existing text file
f.out(true).printLine("world").close
// read text file as big string
echo("\nreadAllStr:")
echo(f.readAllStr.toCode)
// read text file into list of lints
echo("\nreadAllLines:")
echo(f.readAllLines)
// read text file, line by line
echo("\neachLine:")
f.eachLine |line| { echo(line.toCode) }
}
Void binaryIO()
{
echo("\n--- binary IO ---")
f := temp + `binary-io.txt`
show(f, "creating binary file")
// write some binary data
out := f.out
out.write(0x11)
out.writeI2(0x2233)
out.writeI4(0x44556677)
out.writeUtf("abc")
out.close
// read binary data back again
show(f.readAllBuf.toHex, "read entire file into memory buffer")
in := f.in
show(in.read.toHex, "read single 8-bit byte")
show(in.readU2.toHex, "read unsigned 16-bit int")
show(in.readU4.toHex, "read unsigned 32-bit int")
show(in.readUtf, "read UTF string")
in.close
}
Void objIO()
{
echo("\n--- object IO ---")
f := temp + `obj-io.txt`
echo("creating:")
echo(f)
// write a serialized object (list of things)
f.writeObj([2, "hello", 5sec])
// read object back again
show(f.readObj, "File.readObj")
}
Void show(Obj? result, Str what)
{
resultStr := "" + result
if (resultStr.size > 40) resultStr = resultStr[0..40] + "..."
echo(what.padr(40) + " => " + resultStr)
}
}