Skip to main content
Module

std/node/_fs/_fs_dir.ts

Deno standard library
Go to Latest
File
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.import Dirent from "./_fs_dirent.ts";import { assert } from "../../_util/assert.ts";
export default class Dir { #dirPath: string | Uint8Array; #syncIterator!: Iterator<Deno.DirEntry> | null; #asyncIterator!: AsyncIterator<Deno.DirEntry> | null;
constructor(path: string | Uint8Array) { this.#dirPath = path; }
get path(): string { if (this.#dirPath instanceof Uint8Array) { return new TextDecoder().decode(this.#dirPath); } return this.#dirPath; }
// deno-lint-ignore no-explicit-any read(callback?: (...args: any[]) => void): Promise<Dirent | null> { return new Promise((resolve, reject) => { if (!this.#asyncIterator) { this.#asyncIterator = Deno.readDir(this.path)[Symbol.asyncIterator](); } assert(this.#asyncIterator); this.#asyncIterator .next() .then(({ value }) => { resolve(value ? value : null); if (callback) { callback(null, value ? value : null); } }, (err) => { if (callback) { callback(err); } reject(err); }); }); }
readSync(): Dirent | null { if (!this.#syncIterator) { this.#syncIterator = Deno.readDirSync(this.path)![Symbol.iterator](); }
const file: Deno.DirEntry = this.#syncIterator.next().value;
return file ? new Dirent(file) : null; }
/** * Unlike Node, Deno does not require managing resource ids for reading * directories, and therefore does not need to close directories when * finished reading. */ // deno-lint-ignore no-explicit-any close(callback?: (...args: any[]) => void): Promise<void> { return new Promise((resolve) => { if (callback) { callback(null); } resolve(); }); }
/** * Unlike Node, Deno does not require managing resource ids for reading * directories, and therefore does not need to close directories when * finished reading */ closeSync(): void { //No op }
async *[Symbol.asyncIterator](): AsyncIterableIterator<Dirent> { try { while (true) { const dirent: Dirent | null = await this.read(); if (dirent === null) { break; } yield dirent; } } finally { await this.close(); } }}