Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

readdir-enhanced

Package Overview
Dependencies
Maintainers
1
Versions
39
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

readdir-enhanced

fs.readdir with sync, async, and streaming APIs + filtering, recursion, absolute paths, etc.

  • 1.4.0
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
9.1K
decreased by-51.84%
Maintainers
1
Weekly downloads
 
Created
Source

Enhanced fs.readdir()

Build Status Windows Build Status Dependencies Coverage Status Codacy Score Inline docs

npm License

readdir-enhanced enhances Node.js' built-in fs.readdir() and fs.readdirSync() methods to support additional syntaxes (Promises, Streams, EventEmitter) and features (filtering, recursion, absolute paths, stats, and more).

Pick Your API

readdir-enhanced has multiple APIs, so you can pick whichever one you prefer. There are three main APIs:

  • Synchronous API
    aliases: readdir.sync, readdir.readdirSync
    Blocks the thread until all directory contents are read, and then returns all the results.

  • Async API
    aliases: readdir, readdir.async, readdir.readdirAsync
    Reads the directory contents asynchronously and buffers all the results until all contents have been read. Supports callback or Promise syntax (see example below).

  • Streaming API
    aliases: readdir.stream, readdir.readdirStream
    The streaming API reads the directory asynchronously and returns the results in real-time as they are read. The results can be piped to other Node.js streams, or you can listen for specific events via the EventEmitter interface. (see example below)

var readdir = require('readdir-enhanced');
var through2 = require('through2');

// Synchronous API
var files = readdir.sync('my/directory');

// Callback API
readdir.async('my/directory', function(err, files) { ... });

// Promises API
readdir.async('my/directory')
  .then(function(files) { ... })
  .catch(function(err) { ... });

// EventEmitter API
readdir.stream('my/directory')
  .on('data', function(path) { ... })
  .on('file', function(path) { ... })
  .on('directory', function(path) { ... })
  .on('symlink', function(path) { ... })
  .on('error', function(err) { ... });

// Streaming API
var stream = readdir.stream('my/directory')
  .pipe(through2.obj(function(data, enc, next) {
    console.log(data);
    this.push(data);
    next();
  });

Enhanced Features

readdir-enhanced adds several features to the built-in fs.readdir() function. All of the enhanced features are opt-in, which makes readdir-enhanced fully backward compatible by default. You can enable any of the features by passing-in an options argument as the second parameter.

Recursion - options.deep

By default, readdir-enhanced will only return the top-level contents of the directory. But you can enable the deep option to recursively traverse the subdirectories and return their contents as well.

The deep option can be set to true to traverse the entire directory structure, or it can be set to a number to only traverse that many levels deep. For example, calling readdir('my/directory', {deep: 2}) will return subdir1/file.txt and subdir1/subdir2/file.txt, but it won't return subdir1/subdir2/subdir3/file.txt.

var readdir = require('readdir-enhanced');

readdir('my/directory', {deep: true}, function(err, files) {
  console.log(files);
  // => subdir1
  // => subdir1/file.txt
  // => subdir1/subdir2
  // => subdir1/subdir2/file.txt
  // => subdir1/subdir2/subdir3
  // => subdir1/subdir2/subdir3/file.txt
  // ...
});

Filtering - options.filter

The filter option lets limit the results based on any criteria you want.

Filter by path

For simple use-cases, you can use a regular expression or a glob pattern to filter items by their path. The path is relative to the directory, but you can customize this via options.basePath.

NOTE: Glob patterns always use forward-slashes, even on Windows. This does not apply to regular expressions though. Regular expressions should use the appropraite path separator for the environment. Or, you can match both types of separators using [\\/].

var readdir = require('readdir-enhanced');

// Find all .txt files
readdir('my/directory', {filter: '*.txt'});

// Find all package.json files
readdir('my/directory', {filter: '**/package.json', deep: true});

// Find everything with at least one number in the name
readdir('my/directory', {filter: /\d+/});
Advanced filtering

For more advanced filtering, you can specify a filter function that accepts an fs.Stats object and should return a truthy value if the item should be included in the results. The fs.Stats object that is passed to the filter function has an additional path property. The path is relative to the directory by default, but you can customize this via options.basePath.

var readdir = require('readdir-enhanced');

// Only return subdirectories containing an underscore
function myFilter(stats) {
  return stats.isDirectory() && stats.path.indexOf('_') >= 0;
}

readdir('my/directory', {filter: myFilter}, function(err, subdirs) {
  console.log(subdirs);
  // => _tmp
  // => bower_components
  // => node_modules
  // ...
});

Base Path - options.basePath

By default all readdir-enhanced functions return paths that are relative to the directory. But you can use the basePath option to customize this. The basePath will be prepended to all of the returned paths. One common use-case for this is to set basePath to the absolute path of the directory, so that all of the returned paths will be absolute.

var readdir = require('readdir-enhanced');
var path = require('path');

// Get absolute paths
var absPath = path.resolve('my/dir');
readdir('my/directory', {basePath: absPath}, function(err, files) {
  console.log(files);
  // => /absolute/path/to/my/directory/file1.txt
  // => /absolute/path/to/my/directory/file2.txt
  // => /absolute/path/to/my/directory/subdir
  // ...
});

// Get paths relative to the working directory
readdir('my/directory', {basePath: 'my/directory'}, function(err, files) {
  console.log(files);
  // => my/directory/file1.txt
  // => my/directory/file2.txt
  // => my/directory/subdir
  // ...
});

Path Separator - options.sep

By default, readdir-enhanced uses the correct path separator for your OS (\ on Windows, / on Linux & MacOS). But you can set the sep option to any separator character(s) that you want to use instead. This is usually used to ensure consistent path separators across different OSes.

var readdir = require('readdir-enhanced');

// Always use Windows path separators
readdir('my/directory', {sep: '\\', deep: true}, function(err, files) {
  console.log(files);
  // => subdir1
  // => subdir1\file.txt
  // => subdir1\subdir2
  // => subdir1\subdir2\file.txt
  // => subdir1\subdir2\subdir3
  // => subdir1\subdir2\subdir3\file.txt
  // ...
});

Get fs.Stats objects instead of strings

All of the readdir-enhanced functions listed above return an array of strings (paths). But in some situations, the path isn't enough information. So, readdir-enhanced provides alternative versions of each function, which return an array of fs.Stats objects instead of strings. The fs.Stats object contains all sorts of useful information, such the size, the creation date/time, and helper methods such as isFile(), isDirectory(), isSymbolicLink(), etc.

NOTE: The fs.Stats objects that are returned also have an additional path property. The path is relative to the directory by default, but you can customize this via options.basePath.

To get fs.Stats objects instead of strings, just call add the word "Stat" to the function name. As with the normal functions, each one is aliased, so you can use whichever naming style you prefer.

var readdir = require('readdir-enhanced');

// Synchronous API
var stats = readdir.sync.stat('my/directory');
var stats = readdir.readdirSyncStat('my/directory');

// Async API
readdir.async.stat('my/directory', function(err, stats) { ... });
readdir.readdirAsyncStat('my/directory', function(err, stats) { ... });

// Streaming API
readdir.stream.stat('my/directory')
  .on('data', function(stat) { ... })
  .on('file', function(stat) { ... })
  .on('directory', function(stat) { ... })
  .on('symlink', function(stat) { ... });

readdir.readdirStreamStat('my/directory')
  .on('data', function(stat) { ... })
  .on('file', function(stat) { ... })
  .on('directory', function(stat) { ... })
  .on('symlink', function(stat) { ... });

Backward Compatible

readdir-enhanced is fully backward-compatible with Node.js' built-in fs.readdir() and fs.readdirSync() functions, so you can use it as a drop-in replacement in existing projects without affecting existing functionality, while still being able to use the enhanced features as needed.

var readdir = require('readdir-enhanced');
var readdirSync = readdir.sync;

// Use it just like Node's built-in fs.readdir function
readdir('my/directory', function(err, files) { ... });

// Use it just like Node's built-in fs.readdirSync function
var files = readdirSync('my/directory');

Keywords

FAQs

Package last updated on 29 Aug 2016

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc