File I/O and Streams

34.1 Simple File Operations (System.IO)

Imports System.IO

File.WriteAllText("hello.txt", "Hello, file!")
File.AppendAllText("hello.txt", Environment.NewLine & "Another line")
Dim content = File.ReadAllText("hello.txt")
Dim lines = File.ReadAllLines("hello.txt")
File.WriteAllLines("list.txt", {"one", "two", "three"})
For Each line In File.ReadLines("big.log")            ' lazy: good for large files
    If line.Contains("ERROR") Then Console.WriteLine(line)
Next
Dim bytes = File.ReadAllBytes("image.png")
File.WriteAllBytes("copy.png", bytes)

If File.Exists("hello.txt") Then
    File.Copy("hello.txt", "backup.txt", overwrite:=True)
    File.Move("backup.txt", "archive\backup.txt")
    File.Delete("hello.txt")
End If

Dim info As New FileInfo("data.csv")
Console.WriteLine($"{info.Name} {info.Length} bytes, modified {info.LastWriteTime}")
' Async versions: File.ReadAllTextAsync, WriteAllTextAsync, ...

34.2 Directories and Paths

Directory.CreateDirectory("output\reports")
For Each f In Directory.GetFiles("C:\Data", "*.txt", SearchOption.AllDirectories)
    Console.WriteLine(Path.GetFileName(f))
Next
For Each d In Directory.EnumerateDirectories(".")
    Console.WriteLine(d)
Next
Directory.Delete("temp", recursive:=True)

Dim full = Path.Combine("C:\Data", "Reports", "q3.xlsx")
Console.WriteLine(Path.GetExtension(full) & " " & Path.GetFileNameWithoutExtension(full) & " " & Path.GetDirectoryName(full))
Console.WriteLine(Path.GetTempPath() & " " & Path.GetTempFileName() & " " & Path.GetRandomFileName())
Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
Console.WriteLine(AppContext.BaseDirectory)

34.3 Streams, Readers and Writers

Using writer As New StreamWriter("log.txt", append:=True, encoding:=Text.Encoding.UTF8)
    writer.WriteLine($"{Date.Now:s} Application started")
End Using

Using reader As New StreamReader("log.txt")
    While Not reader.EndOfStream
        Console.WriteLine(reader.ReadLine())
    End While
End Using

Using fs As New FileStream("data.bin", FileMode.Create), bw As New BinaryWriter(fs)
    bw.Write(42) : bw.Write(3.14) : bw.Write("text")
End Using
Using fs As New FileStream("data.bin", FileMode.Open), br As New BinaryReader(fs)
    Console.WriteLine($"{br.ReadInt32()} {br.ReadDouble()} {br.ReadString()}")
End Using

Using ms As New MemoryStream()
    ms.Write(bytes, 0, bytes.Length)
End Using

34.4 Compression and Watching Files

Imports System.IO.Compression
ZipFile.CreateFromDirectory("reports", "reports.zip")
ZipFile.ExtractToDirectory("reports.zip", "extracted")

Dim watcher As New FileSystemWatcher("C:\Inbox", "*.csv") With {.EnableRaisingEvents = True}
AddHandler watcher.Created, Sub(s, e) Console.WriteLine($"New file: {e.FullPath}")