File I/O, OS and Processes

31.1 Files

import os

fn main() {
	os.write_file('hello.txt', 'Hello V\n') or { panic(err) }
	content := os.read_file('hello.txt') or { panic(err) }
	println(content)
	lines := os.read_lines('hello.txt') or { [] }
	for l in lines { println(l) }

	mut f := os.create('log.txt') or { panic(err) }
	defer { f.close() }
	f.writeln('line 1') or {}
	f.write_string('line 2\n') or {}

	mut af := os.open_append('log.txt') or { panic(err) }
	af.writeln('appended') or {}
	af.close()

	bytes := os.read_bytes('image.png') or { []u8{} }
	_ = bytes
}

31.2 Paths and Directories

println(os.getwd())
println(os.home_dir())
println(os.temp_dir())
println(os.executable())
p := os.join_path('dir', 'sub', 'file.txt')
println(os.base(p))
println(os.dir(p))
println(os.file_ext(p))
println(os.file_name(p))
println(os.exists('x'))
println(os.is_dir('src'))
println(os.is_file('main.v'))
os.mkdir_all('build/out') or {}
os.cp('a.txt', 'b.txt') or {}
os.mv('b.txt', 'c.txt') or {}
os.rm('c.txt') or {}
os.rmdir_all('build') or {}
files := os.ls('.') or { [] }
all := os.walk_ext('.', '.v')               // recursive by extension
os.walk('.', fn (path string) { println(path) })
println(os.file_size('main.v'))
println(os.file_last_mod_unix('main.v'))
println(os.glob('*.v') or { [] })
println(os.real_path('.'))

31.3 Environment, Arguments, Processes

println(os.args)                        // []string, args[0] = program
println(os.getenv('HOME'))
println(os.getenv_opt('MISSING') or { 'none' })
os.setenv('MY_VAR', '1', true)
println(os.environ())

res := os.execute('git --version')       // returns os.Result{exit_code, output}
println(res.exit_code)
println(res.output)
code := os.system('ls -la')
_ = code
mut p := os.new_process('/bin/ls')
p.set_args(['-la'])
p.set_redirect_stdio()
p.run()
p.wait()
println(p.stdout_slurp())
p.close()
os.signal_opt(.int, fn (s os.Signal) { println('Ctrl+C') }) or {}
exit(0)