Read and write files

Concepts

Overview

Interacting with the filesystem to read and write files is a common requirement. Deno provides a number of ways to do this via the standard library and the Deno runtime API.

As highlighted in the Fetch Data example Deno restricts access to Input / Output by default for security reasons. Therefore when interacting with the filesystem the --allow-read and --allow-write flags must be used with the deno run command.

Reading a text file

The Deno runtime API makes it possible to read text files via the Deno.readTextFile() method, it just requires a path string or URL object. The method returns a promise which provides access to the file's text data.

Command: deno run --allow-read read.ts

/**
 * read.ts
 */
const text = Deno.readTextFile("./people.json");

text.then((response) => console.log(response));

/**
 * Output:
 *
 * [
 *   {"id": 1, "name": "John", "age": 23},
 *   {"id": 2, "name": "Sandra", "age": 51},
 *   {"id": 5, "name": "Devika", "age": 11}
 * ]
 */

Writing a text file

The Deno runtime API allows developers to write text to files via the Deno.writeTextFile() method. It just requires a file path and text string. The method returns a promise which resolves when the file was successfully written.

To run the command the --allow-write flag must be supplied to the deno run command.

Command: deno run --allow-write write.ts

/**
 * write.ts
 */
const write = await Deno.writeTextFile("./hello.txt", "Hello World!");

write.then(() => console.log("File written to ./hello.txt"));

/**
 * Output: File written to ./hello.txt
 */

By combining Deno.writeTextFile and JSON.stringify you can easially write serialized JSON objects to a file. This example uses synchronous Deno.writeTextFileSync, but this can also be done asynchronously using await Deno.writeTextFile.

To execute the code the deno run command needs the write flag.

Command: deno run --allow-write write.ts

/**
 * write.ts
 */
function writeJson(path: string, data: object): string {
  try {
    Deno.writeTextFileSync(path, JSON.stringify(data));

    return "Written to " + path;
  } catch (e) {
    return e.message;
  }
}

console.log(writeJson("./data.json", { hello: "World" }));

/**
 * Output: Written to ./data.json
 */