2026-01-24 23:40:22 +01:00
<!DOCTYPE html>
<!-- retoor <retoor@molodetz.nl> -->
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > File Operations - Wren-CLI Manual</ title >
< link rel = "stylesheet" href = "../css/style.css" >
</ head >
< body >
< button class = "mobile-menu-toggle" > Menu</ button >
< div class = "container" >
< aside class = "sidebar" >
< div class = "sidebar-header" >
< h1 >< a href = "../index.html" > Wren-CLI</ a ></ h1 >
< div class = "version" > v0.4.0</ div >
</ div >
< nav class = "sidebar-nav" >
< div class = "section" >
< span class = "section-title" > Getting Started</ span >
< ul >
< li >< a href = "../getting-started/index.html" > Overview</ a ></ li >
< li >< a href = "../getting-started/installation.html" > Installation</ a ></ li >
< li >< a href = "../getting-started/first-script.html" > First Script</ a ></ li >
< li >< a href = "../getting-started/repl.html" > Using the REPL</ a ></ li >
</ ul >
</ div >
< div class = "section" >
< span class = "section-title" > Language</ span >
< ul >
< li >< a href = "../language/index.html" > Syntax Overview</ a ></ li >
< li >< a href = "../language/classes.html" > Classes</ a ></ li >
< li >< a href = "../language/methods.html" > Methods</ a ></ li >
< li >< a href = "../language/control-flow.html" > Control Flow</ a ></ li >
< li >< a href = "../language/fibers.html" > Fibers</ a ></ li >
< li >< a href = "../language/modules.html" > Modules</ a ></ li >
</ ul >
</ div >
< div class = "section" >
< span class = "section-title" > API Reference</ span >
< ul >
< li >< a href = "../api/index.html" > Overview</ a ></ li >
2026-01-25 04:58:39 +01:00
< li >< a href = "../api/string.html" > String</ a ></ li >
< li >< a href = "../api/number.html" > Num</ a ></ li >
2026-01-24 23:40:22 +01:00
< li >< a href = "../api/http.html" > http</ a ></ li >
< li >< a href = "../api/websocket.html" > websocket</ a ></ li >
< li >< a href = "../api/tls.html" > tls</ a ></ li >
< li >< a href = "../api/net.html" > net</ a ></ li >
< li >< a href = "../api/dns.html" > dns</ a ></ li >
< li >< a href = "../api/json.html" > json</ a ></ li >
< li >< a href = "../api/base64.html" > base64</ a ></ li >
< li >< a href = "../api/regex.html" > regex</ a ></ li >
< li >< a href = "../api/jinja.html" > jinja</ a ></ li >
< li >< a href = "../api/crypto.html" > crypto</ a ></ li >
< li >< a href = "../api/os.html" > os</ a ></ li >
< li >< a href = "../api/env.html" > env</ a ></ li >
< li >< a href = "../api/signal.html" > signal</ a ></ li >
< li >< a href = "../api/subprocess.html" > subprocess</ a ></ li >
< li >< a href = "../api/sqlite.html" > sqlite</ a ></ li >
< li >< a href = "../api/datetime.html" > datetime</ a ></ li >
< li >< a href = "../api/timer.html" > timer</ a ></ li >
< li >< a href = "../api/io.html" > io</ a ></ li >
2026-01-25 04:58:39 +01:00
< li >< a href = "../api/pathlib.html" > pathlib</ a ></ li >
2026-01-24 23:40:22 +01:00
< li >< a href = "../api/scheduler.html" > scheduler</ a ></ li >
< li >< a href = "../api/math.html" > math</ a ></ li >
</ ul >
</ div >
< div class = "section" >
< span class = "section-title" > Tutorials</ span >
< ul >
< li >< a href = "../tutorials/index.html" > Tutorial List</ a ></ li >
< li >< a href = "../tutorials/http-client.html" > HTTP Client</ a ></ li >
< li >< a href = "../tutorials/websocket-chat.html" > WebSocket Chat</ a ></ li >
< li >< a href = "../tutorials/database-app.html" > Database App</ a ></ li >
< li >< a href = "../tutorials/template-rendering.html" > Template Rendering</ a ></ li >
< li >< a href = "../tutorials/cli-tool.html" > CLI Tool</ a ></ li >
</ ul >
</ div >
< div class = "section" >
< span class = "section-title" > How-To Guides</ span >
< ul >
< li >< a href = "index.html" > How-To List</ a ></ li >
< li >< a href = "http-requests.html" > HTTP Requests</ a ></ li >
< li >< a href = "json-parsing.html" > JSON Parsing</ a ></ li >
< li >< a href = "regex-patterns.html" > Regex Patterns</ a ></ li >
< li >< a href = "file-operations.html" class = "active" > File Operations</ a ></ li >
< li >< a href = "async-operations.html" > Async Operations</ a ></ li >
< li >< a href = "error-handling.html" > Error Handling</ a ></ li >
</ ul >
</ div >
</ nav >
</ aside >
< main class = "content" >
< nav class = "breadcrumb" >
< a href = "../index.html" > Home</ a >
< span class = "separator" > /</ span >
< a href = "index.html" > How-To Guides</ a >
< span class = "separator" > /</ span >
< span > File Operations</ span >
</ nav >
< article >
< h1 > File Operations</ h1 >
< h2 > Read Entire File</ h2 >
< pre >< code > import "io" for File
var content = File.read("document.txt")
System.print(content)</ code ></ pre >
< h2 > Write to File</ h2 >
< pre >< code > import "io" for File
File.write("output.txt", "Hello, World!")
System.print("File written!")</ code ></ pre >
< h2 > Append to File</ h2 >
< pre >< code > import "io" for File
var existing = File.exists("log.txt") ? File.read("log.txt") : ""
File.write("log.txt", existing + "New line\n")</ code ></ pre >
< h2 > Check if File Exists</ h2 >
< pre >< code > import "io" for File
if (File.exists("config.txt")) {
System.print("Config found")
var content = File.read("config.txt")
} else {
System.print("Config not found, using defaults")
}</ code ></ pre >
< h2 > Get File Size</ h2 >
< pre >< code > import "io" for File
var size = File.size("data.bin")
System.print("File size: %(size) bytes")</ code ></ pre >
< h2 > Copy File</ h2 >
< pre >< code > import "io" for File
File.copy("source.txt", "destination.txt")
System.print("File copied!")</ code ></ pre >
< h2 > Rename/Move File</ h2 >
< pre >< code > import "io" for File
File.rename("old_name.txt", "new_name.txt")
System.print("File renamed!")
File.rename("file.txt", "subdir/file.txt")
System.print("File moved!")</ code ></ pre >
< h2 > Delete File</ h2 >
< pre >< code > import "io" for File
if (File.exists("temp.txt")) {
File.delete("temp.txt")
System.print("File deleted!")
}</ code ></ pre >
< h2 > List Directory Contents</ h2 >
< pre >< code > import "io" for Directory
var files = Directory.list(".")
for (file in files) {
System.print(file)
}</ code ></ pre >
< h2 > Check if Directory Exists</ h2 >
< pre >< code > import "io" for Directory
if (Directory.exists("data")) {
System.print("Directory found")
} else {
System.print("Directory not found")
}</ code ></ pre >
< h2 > Create Directory</ h2 >
< pre >< code > import "io" for Directory
if (!Directory.exists("output")) {
Directory.create("output")
System.print("Directory created!")
}</ code ></ pre >
< h2 > Delete Empty Directory</ h2 >
< pre >< code > import "io" for Directory
Directory.delete("empty_folder")
System.print("Directory deleted!")</ code ></ pre >
< h2 > Read File Line by Line</ h2 >
< pre >< code > import "io" for File
var content = File.read("data.txt")
var lines = content.split("\n")
for (line in lines) {
if (line.count > 0) {
System.print(line)
}
}</ code ></ pre >
< h2 > Process Files in Directory</ h2 >
< pre >< code > import "io" for File, Directory
var files = Directory.list("./data")
for (filename in files) {
if (filename.endsWith(".txt")) {
var path = "./data/%(filename)"
var content = File.read(path)
System.print("%(filename): %(content.count) chars")
}
}</ code ></ pre >
< h2 > Recursive Directory Listing</ h2 >
< pre >< code > import "io" for File, Directory
var listRecursive = Fn.new { |path, indent|
var items = Directory.list(path)
for (item in items) {
var fullPath = "%(path)/%(item)"
System.print("%(indent)%(item)")
if (Directory.exists(fullPath)) {
listRecursive.call(fullPath, indent + " ")
}
}
}
listRecursive.call(".", "")</ code ></ pre >
< h2 > Find Files by Extension</ h2 >
< pre >< code > import "io" for File, Directory
var findByExtension = Fn.new { |path, ext|
var results = []
var items = Directory.list(path)
for (item in items) {
var fullPath = "%(path)/%(item)"
if (Directory.exists(fullPath)) {
var subResults = findByExtension.call(fullPath, ext)
for (r in subResults) results.add(r)
} else if (item.endsWith(ext)) {
results.add(fullPath)
}
}
return results
}
var wrenFiles = findByExtension.call(".", ".wren")
for (file in wrenFiles) {
System.print(file)
}</ code ></ pre >
< h2 > Read JSON Configuration</ h2 >
< pre >< code > import "io" for File
import "json" for Json
var loadConfig = Fn.new { |path, defaults|
if (!File.exists(path)) {
return defaults
}
var content = File.read(path)
var config = Json.parse(content)
for (key in defaults.keys) {
if (!config.containsKey(key)) {
config[key] = defaults[key]
}
}
return config
}
var config = loadConfig.call("config.json", {
"port": 8080,
"debug": false
})
System.print("Port: %(config["port"])")</ code ></ pre >
< h2 > Save JSON Configuration</ h2 >
< pre >< code > import "io" for File
import "json" for Json
var config = {
"database": "app.db",
"port": 8080,
"debug": true
}
File.write("config.json", Json.stringify(config, 2))
System.print("Configuration saved!")</ code ></ pre >
< h2 > Create Backup Copy</ h2 >
< pre >< code > import "io" for File
import "datetime" for DateTime
var backup = Fn.new { |path|
if (!File.exists(path)) {
System.print("File not found: %(path)")
return null
}
var timestamp = DateTime.now().format("\%Y\%m\%d_\%H\%M\%S")
var backupPath = "%(path).%(timestamp).bak"
File.copy(path, backupPath)
System.print("Backup created: %(backupPath)")
return backupPath
}
backup.call("important.txt")</ code ></ pre >
< h2 > Read User Input</ h2 >
< pre >< code > import "io" for Stdin
System.write("Enter your name: ")
var name = Stdin.readLine()
System.print("Hello, %(name)!")</ code ></ pre >
< h2 > Interactive Menu</ h2 >
< pre >< code > import "io" for Stdin
System.print("Select an option:")
System.print("1. Option A")
System.print("2. Option B")
System.print("3. Exit")
System.write("Choice: ")
var choice = Stdin.readLine()
if (choice == "1") {
System.print("You selected Option A")
} else if (choice == "2") {
System.print("You selected Option B")
} else if (choice == "3") {
System.print("Goodbye!")
}</ code ></ pre >
< h2 > Safe File Operations with Error Handling</ h2 >
< pre >< code > import "io" for File
var safeRead = Fn.new { |path|
var fiber = Fiber.new { File.read(path) }
var result = fiber.try()
if (fiber.error) {
System.print("Error reading %(path): %(fiber.error)")
return null
}
return result
}
var content = safeRead.call("maybe_exists.txt")
if (content) {
System.print("Content: %(content)")
}</ code ></ pre >
< h2 > Calculate Directory Size</ h2 >
< pre >< code > import "io" for File, Directory
var dirSize = Fn.new { |path|
var total = 0
var items = Directory.list(path)
for (item in items) {
var fullPath = "%(path)/%(item)"
if (Directory.exists(fullPath)) {
total = total + dirSize.call(fullPath)
} else if (File.exists(fullPath)) {
total = total + File.size(fullPath)
}
}
return total
}
var size = dirSize.call(".")
System.print("Total size: %(size) bytes")</ code ></ pre >
< div class = "admonition tip" >
< div class = "admonition-title" > See Also</ div >
2026-01-25 04:58:39 +01:00
< p > For full API documentation, see the < a href = "../api/io.html" > IO module reference</ a > . For object-oriented path manipulation with glob, walk, and tree operations, see the < a href = "../api/pathlib.html" > pathlib module reference</ a > .</ p >
2026-01-24 23:40:22 +01:00
</ div >
</ article >
< footer class = "page-footer" >
< a href = "regex-patterns.html" class = "prev" > Regex Patterns</ a >
< a href = "async-operations.html" class = "next" > Async Operations</ a >
</ footer >
</ main >
</ div >
< script src = "../js/main.js" ></ script >
</ body >
</ html >