File System, Streams and Serialization

31.1 Files and Directories

Imports System.IO
Dim root = Path.Combine(AppContext.BaseDirectory, "data")
Directory.CreateDirectory(root)
Dim file1 = Path.Combine(root, "notes.txt")
Await File.WriteAllTextAsync(file1, "Hello")
Await File.AppendAllLinesAsync(file1, {"line 2", "line 3"})
For Each line In File.ReadLines(file1) : Console.WriteLine(line) : Next
For Each f In Directory.EnumerateFiles(root, "*.txt", New EnumerationOptions With {.RecurseSubdirectories = True})
    Dim info As New FileInfo(f)
    Console.WriteLine($"{info.Name} {info.Length:N0} bytes")
Next

31.2 Streams

Files (FileOptions.Asynchronous, buffer size) GZipStream, BrotliStream, ZLibStream NetworkStream, SslStream Named/anonymous pipes (IPC)

StreamReader/StreamWriter, BinaryReader/BinaryWriter Text/binary adapters

Memory-mapped files (MemoryMappedFile) for huge files and IPC. FileSystemWatcher for change notifications.

Using input = File.OpenRead("log.txt"),
      output = File.Create("log.txt.gz"),
      gzip As New Compression.GZipStream(output, Compression.CompressionLevel.Optimal)
    Await input.CopyToAsync(gzip)
End Using

31.3 Serialization

System.Text.Json (fast, built-in), Newtonsoft.Json (feature-rich, legacy)

XmlSerializer, DataContractSerializer, XML literals TextFieldParser, CsvHelper

MessagePack-CSharp, protobuf-net (works from VB), BinaryWriter ClosedXML, EPPlus, NPOI

⚠️ BinaryFormatter is removed/disabled in modern .NET (security risk). Never deserialize untrusted data with type-name-handling features (Newtonsoft TypeNameHandling.All).

Imports System.Text.Json
Dim opts As New JsonSerializerOptions(JsonSerializerDefaults.Web) With {.WriteIndented = True}
Dim json = JsonSerializer.Serialize(order, opts)

Using fs = File.Create("order.json")
    Await JsonSerializer.SerializeAsync(fs, order, opts)
End Using
Using fs = File.OpenRead("order.json")
    Dim loaded = Await JsonSerializer.DeserializeAsync(Of Order)(fs, opts)
End Using