Filer is a drop-in replacement for node's fs
module, a POSIX-like file system
for browsers.
Filer uses IndexedDB and is known to work in the following browsers/versions:
- node.js: v0.10.*+
- IE: 10+
- Edge: 12+
- Firefox: 10+
- Chrome: 23+
- Safari: 10+
- Opera: 15+
- iOS: 10+
- Android Browser: 4.4+
Want to join the fun? We'd love to have you! See CONTRIBUTING.
Filer can be obtained in a number of ways:
- Via npm:
npm install filer
- Via unpkg:
<script src="https://unpkg.com/filer"></script>
or specify a version directly, for example: https://unpkg.com/filer@1.0.1/dist/filer.min.js
Filer is built as a UMD module and can therefore be loaded as a CommonJS or AMD module, or used via the global.
// Option 1: Filer loaded via require()
var Filer = require('filer');
// Option 2: Filer loaded via RequireJS
requirejs.config({
baseUrl: '/',
paths: {
'filer': 'filer/dist/filer'
}
});
requirejs(['filer'], function(Filer) {...}
// Option 3: Filer on global
var Filer = window.Filer;
Filer can be used as a drop-in replacement for the node.js fs and path modules. For convenience, filer provides a webpack plugin which will shim the desired node.js functionality. This plugin can be used by inserting the following into your webpack config:
// webpack.config.js
var { FilerWebpackPlugin } = require('filer/webpack');
module.exports = {
plugins: [
new FilerWebpackPlugin(),
],
}
NOTE
Previously it was recommended to access the FilerWebpackPlugin
class by importing the main filer module. This was depracated due this issue. For anyone using filer version 1.4.0 or earlier, please import the plugin class like this:
var FilerWebpackPlugin = require('filer/src/webpack-plugin');
You can then import the node.js fs and path
modules as normal and FilerWebpackPlugin
will ensure that webpack will resolve references to these modules to
the appropriate filer shims. You will then be able to use these modules as normal (with the exception of the
synchronous fs methods e.g. mkdirSync()
).
import fs from 'fs';
import path from 'path';
The filer webpack plugin will, by default, shim the fs and path modules. However, it's behaviour can be customised by passing an options object.
// webpack.config.js
module.exports = {
plugins: [
new FilerWebpackPlugin({
// Options
}),
],
}
The following options can be passed to the filer webpack plugin:
Option | Type | Optional | Default | Description |
---|---|---|---|---|
filerDir | string | yes | '<rootDir>/node_modules/filer' | The directory in which filer is installed. |
shimsDir | string | yes | '<rootDir>/node_modules/filer/shims' | The directory in which the shims are installed. |
fsProviderDir | string | yes | '<rootDir>/node_modules/filer/shims/providers' | The directory in which the shims are located. This option is required when using a custom provider. |
shimFs | boolean | yes | true | Should the fs module be shimmed. |
shimPath | boolean | yes | true | Should the path module be shimmed. |
fsProvider | string | yes | 'default' | The file system provider to use. Should be one of 'default', 'indexeddb', 'memory', 'custom'. The 'default' option is equivalent to 'indexeddb'. |
NOTE: '<rootDir>' will be resolved to the current working directory.
Though filer also exposes the Buffer object, it is left up to the user to shim this as appropriate. This is because filer offers no custom implementation. Currently, filer uses the node-libs-browser Buffer implementation internally, though any faithful implementation of the node.js Buffer object should play nicely with filer.
Filer is as close to the node.js fs module as possible, with the following differences:
- No synchronous versions of methods (e.g.,
mkdir()
but notmkdirSync()
). - No support for stream-based operations (e.g.,
fs.ReadStream
,fs.WriteStream
).
Filer has other features lacking in node.js (e.g., swappable backend storage providers, extended attributes, etc).
Like node.js, the API is asynchronous and most methods expect the caller to provide a callback function (note: like node.js, Filer will supply one if it's missing). Errors are passed to callbacks through the first parameter. As with node.js, there is no guarantee that file system operations will be executed in the order they are invoked. Ensure proper ordering by chaining operations in callbacks.
To create a new file system or open an existing one, create a new FileSystem
instance. By default, a new IndexedDB
database is created for each file system. The file system can also use other
backend storage providers, for example Memory
. See the section on Storage Providers.
const { fs, path } = require('filer');
fs.mkdir('/docs', (err) => {
if (err) {
return console.error('Unable to create /docs dir', err);
}
const filename = path.join('/docs', 'first.txt');
const data = 'Hello World!\n';
fs.writeFile(filename, data, (err) => {
if (err) {
return console.error('Unable to write /docs/first.txt', err);
}
fs.stat(filename, (err, stats) => {
if (err) {
return console.error('Unable to stat /docs/first.txt', err);
}
console.log('Stats for /docs/first.txt:', stats);
});
});
});
For a complete list of FileSystem
methods and examples, see the FileSystem Instance Methods
section below.
Filer also includes node's path
and Buffer
modules. See the Filer.Path and Filer.Buffer sections below.
In addition, common shell operations (e.g., rm, touch, cat, etc.) are supported via the
FileSystemShell
object, which can be obtained from, and used with a FileSystem
.
See theFileSystemShell section below.
Like node.js, callbacks for methods that accept them are optional but suggested (i.e., if
you omit the callback, errors will be thrown as exceptions). The first callback parameter is
reserved for passing errors. It will be null
if no errors occurred and should always be checked.
The Promise based API mimics the way node implements them. Both Shell
and FileSystem
now have a promises
property, which gives access to Promise based versions of methods in addition to the regular callback style methods. Method names are identical to their callback counterparts with the difference that instead of receiving a final argument as a callback, they return a Promise that is resolved or rejected based on the success of method execution.
See example below:
const fs = new Filer.FileSystem().promises;
fs.writeFile('/myfile', 'some data')
.then(() => fs.stat('/myfile'))
.then(stats => { console.log(`stats: ${JSON.stringify(stats)}`); })
.catch(err => { console.error(err); });
In most cases, using Filer.fs
will be sufficient, and provide a working filesystem.
However, if you need more control over the filesystem, you can also use the FileSystem
constructor, invoked to open an existing file system or create a new one.
Filer.FileSystem()
It accepts two arguments: an options
object, and an optional
callback
function. The options
object can specify a number of optional arguments,
including:
name
: the name of the file system, defaults to'"local'
flags
: an Array of one or more flags to use when creating/opening the file system:'FORMAT'
to force Filer to format (i.e., erase) the file system'NOCTIME'
to force Filer to not updatectime
on nodes when metadata changes (i.e., for better performance)'NOMTIME'
to force Filer to not updatemtime
on nodes when data changes (i.e., for better performance)
provider
: an explicit storage provider to use for the file system's database context provider. See the section on Storage Providers.
The callback
function indicates when the file system is ready for use. Depending on the storage provider used, this might
be right away, or could take some time. The callback should expect two arguments: first, an error
argument, which will be
null if everything worked; second, an instance, such that you can access the newly ready FileSystem instance. Also users
should check the file system's readyState
and error
properties to make sure it is usable.
var fs;
function fsReady(err, fs) {
if(err) throw err;
// Safe to use fs now..
F438
.
}
fs = new Filer.FileSystem({
name: "my-filesystem",
flags: [ 'FORMAT' ],
provider: new Filer.FileSystem.providers.Memory()
}, fsReady);
NOTE: if the optional callback argument is not passed to the FileSystem
constructor,
operations done on the resulting file system will be queued and run in sequence when
it becomes ready.
Filer can be configured to use a number of different storage providers. The provider object encapsulates all aspects of data access, making it possible to swap in different backend storage options. There are currently 2 providers to choose from:
FileSystem.providers.IndexedDB()
- uses IndexedDB if necessaryFileSystem.providers.Memory()
- uses memory (not suitable for data that needs to survive the current session)
NOTE: previous versions of Filer also supported FileSystem.providers.WebSQL()
and
FileSystem.providers.Fallback()
, which could be used in browsers that supported
WebSQL but not IndexedDB. WebSQL has been deprecated,
and this functionality was removed in v1.0.0
. If for some reason you still need it, use v0.0.44
.
You can choose your provider when creating a FileSystem
:
var FileSystem = Filer.FileSystem;
var providers = FileSystem.providers;
// Example 1: Use the default provider (currently IndexedDB)
var fs1 = new FileSystem();
// Example 2: Use the Memory provider
var fs2 = new FileSystem({ provider: new providers.Memory() });
Every provider has an isSupported()
method, which returns true
if the browser supports this provider:
if( Filer.FileSystem.providers.IndexedDB.isSupported() ) {
// IndexedDB provider will work in current environment...
}
You can also write your own provider if you need a different backend. See the code in src/providers
for details.
When reading and writing data, Filer follows node.js and uses Buffer
.
When in a node.js environment, native Buffer
s can be used, or Filer.Buffer, which is a shortcut
to node's Buffer
. In a browser, you can use also use Filer.Buffer
.
NOTE: a Filer.Buffer
in a browser is really an augmented Uint8Array
(i.e., the node Buffer
api
methods are added to the instance). See https://github.com/feross/buffer for more details.
NOTE: Filer.Buffer
currently includes the older, deprecated constructor functions, but these will be removed
at some point. You are encouraged to switch to use the newer class methods Buffer.from()
and Buffer.alloc()
. See the node.js Buffer docs.
/* Deprecated - see https://nodejs.org/api/buffer.html#buffer_new_buffer_array */
new Buffer(array)
new Buffer(arrayBuffer[, byteOffset[, length]])
new Buffer(buffer)
new Buffer(string[, encoding])
new Buffer(size)
/* Use Instead */
Buffer.from(array)
Buffer.from(arrayBuffer[, byteOffset[, length]])
Buffer.from(buffer)
Buffer.from(string[, encoding])
Buffer.alloc(size)
Buffer.allocUnsafe(size)
The node.js path module is available via Filer.path
or
Filer.Path
(both are supported for historical reasons, and to match node). The Filer path
module is identical to the node.js version (see https://github.com/browserify/path-browserify), with the following differences:
- The CWD always defaults to
/
- No support for Windows style paths (assume you are on a POSIX system)
- Additional utility methods (see below)
var path = Filer.path;
var dir = path.dirname('/foo/bar/baz/asdf/quux');
// dir is now '/foo/bar/baz/asdf'
var base = path.basename('/foo/bar/baz/asdf/quux.html');
// base is now 'quux.html'
var ext = path.extname('index.html');
// ext is now '.html'
var newpath = path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// new path is now '/foo/bar/baz/asdf'
For more info see the docs in the path module for a particular method:
path.normalize(p)
- NOTE: Filer.Path.normalize does not add a trailing slashpath.join([path1], [path2], [...])
path.resolve([from ...], to)
path.relative(from, to)
path.dirname(p)
path.basename(p, [ext])
- NOTE: Filer.Path.basename will return'/'
vs.''
path.extname(p)
path.sep
path.delimiter
Filer.Path also includes the following extra methods:
isNull(p)
returnstrue
orfalse
if the path contains a null character ('\u0000'
)addTrailing(p)
returns the pathp
with a single trailing slash addedremoveTrailing(p)
returns the pathp
with trailing slash(es) removed
As with node.js, all methods below that
accept a path
argument as a String
can also take a file://
URL
or a Buffer
. For example, all of the following cases will work the same way with Filer:
// 1. path as a String
fs.writeFile('/dir/file.txt', 'data', function(err) {...});
// 2. path as a URL
fs.writeFile(new URL('file:///dir/file.txt'), 'data', function(err) {...});
// 3. path as a Buffer
fs.writeFile(Buffer.from('/dir/file.txt'), 'data', function(err) {...});
The error objects used internally by Filer are also exposed via the Filer.Errors
object. As much as possible
these match their node.js counterparts, with a few Filer-specifc additions.
See src/errors.js for the complete
list. Errors can be used, or compared, like so:
Examples:
// Example 1: create an EExist error
var err1 = new Filer.Errors.EEXIST();
var err2 = new Filer.Errors[47];
// Example 2: compare an error to see if it is EInvalid
function callback(err) {
if(err instanceof Filer.Errors.EINVAL){
...
}
// Or compare the error's code
if(err.code === 'EINVAL') {
...
}
}
// Example 4: compare an error using errno
function callback(err) {
if(err.errno === 47){
...
}
// Example 5: display the error message
console.log(err.message);
Once a FileSystem
is created, it has the following methods. NOTE: code examples below assume
a FileSystem
instance named fs
has been created like so:
// 1. Using Filer.fs for a default filesystem
const { fs } = require('filer');
// 2. Or via the FileSystem constructor with specified options
const fs = new Filer.FileSystem(options, callback);
- fs.rename(oldPath, newPath, callback)
- fs.ftruncate(fd, len, callback)
- fs.truncate(path, len, callback)
- fs.stat(path, callback)
- fs.fstat(fd, callback)
- fs.lstat(path, callback)
- fs.exists(path, callback)
- fs.link(srcpath, dstpath, callback)
- fs.symlink(srcpath, dstpath, [type], callback)
- fs.readlink(path, callback)
- fs.realpath(path, [cache], callback)
- fs.unlink(path, callback)
- fs.mknod(path, mode, callback)
- fs.rmdir(path, callback)
- fs.mkdir(path, [mode], callback)
- fs.access(path, [mode], callback)
- fs.mkdtemp(path, [options], callback)
- fs.readdir(path, callback)
- fs.close(fd, callback)
- fs.open(path, flags, [mode], callback)
- fs.utimes(path, atime, mtime, callback)
- fs.chown(path, uid, gid, callback)
- fs.fchown(fd, uid, gid, callback)
- fs.chmod(path, mode, callback)
- fs.fchmod(fd, mode, callback)
- fs.futimes(fd, atime, mtime, callback)
- fs.fsync(fd, callback)
- fs.write(fd, buffer, offset, length, position, callback)
- fs.read(fd, buffer, offset, length, position, callback)
- fs.readFile(filename, [options], callback)
- fs.writeFile(filename, data, [options], callback)
- fs.appendFile(filename, data, [options], callback)
- fs.setxattr(path, name, value, [flag], callback)
- fs.fsetxattr(fd, name, value, [flag], callback)
- fs.getxattr(path, name, callback)
- fs.fgetxattr(fd, name, callback)
- fs.removexattr(path, name, callback)
- fs.fremovexattr(fd, name, callback)
- fs.watch(filename, [options], [listener])
Renames the file at oldPath
to newPath
. Asynchronous rename(2).
Callback gets no additional arguments.
Example:
// Rename myfile.txt to myfile.bak
fs.rename("/myfile.txt", "/myfile.bak", function(err) {
if(err) throw err;
// myfile.txt is now myfile.bak
});
Change the size of the file represented by the open file descriptor fd
to be length
len
bytes. Asynchronous ftruncate(2).
If the file is larger than len
, the extra bytes will be discarded; if smaller, its size will
be increased, and the extended area will appear as if it were zero-filled. See also fs.truncate().
Example:
// Create a file, shrink it, expand it.
var buffer = Filer.Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);
fs.open('/myfile', 'w', function(err, fd) {
if(err) throw error;
fs.write(fd, buffer, 0, buffer.length, 0, function(err, result) {
if(err) throw error;
fs.ftruncate(fd, 3, function(err) {
if(err) throw error;
// /myfile is now 3 bytes in length, rest of data discarded
fs.ftruncate(fd, 50, function(err) {
if(err) throw error;
// /myfile is now 50 bytes in length, with zero padding at end
fs.close(fd);
});
});
});
});
});
Change the size of the file at path
to be length len
bytes. Asynchronous truncate(2). If the file is larger than len
, the extra bytes will be discarded; if smaller, its size will
be increased, and the extended area will appear as if it were zero-filled. See also fs.ftruncate().
Example:
// Create a file, shrink it, expand it.
var buffer = Filer.Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);
fs.open('/myfile', 'w', function(err, fd) {
if(err) throw error;
fs.write(fd, buffer, 0, buffer.length, 0, function(err, result) {
if(err) throw error;
fs.close(fd, function(err) {
if(err) throw error;
fs.truncate('/myfile', 3, function(err) {
if(err) throw error;
// /myfile is now 3 bytes in length, rest of data discarded
fs.truncate('/myfile', 50, function(err) {
if(err) throw error;
// /myfile is now 50 bytes in length, with zero padding at end
});
});
});
});
});
Obtain file status about the file at path
. Asynchronous stat(2).
Callback gets (error, stats)
, where stats
is an object with the following properties:
{
node: <string> // internal node id (unique)
dev: <string> // file system name
name: <string> // the entry's name (basename)
size: <number> // file size in bytes
nlinks: <number> // number of links
atime: <date> // last access time as JS Date Object
mtime: <date> // last modified time as JS Date Object
ctime: <date> // creation time as JS Date Object
atimeMs: <number> // last access time as Unix Timestamp
mtimeMs: <number> // last modified time as Unix Timestamp
ctimeMs: <number> // creation time as Unix Timestamp
type: <string> // file type (FILE, DIRECTORY, SYMLINK),
gid: <number> // group name
uid: <number> // owner name
mode: <number> // permissions
version: <number> // version of the node
}
The following convenience methods are also present on the callback's stats
:
isFile(): Returns true if the node is a file.
isDirectory(): Returns true if the node is a directory.
isBlockDevice(): Not implemented, returns false.
isCharacterDevice(): Not implemented, returns false.
isSymbolicLink(): Returns true if the node is a symbolic link.
isFIFO(): Not implemented, returns false.
isSocket(): Not implemented, returns false.
If the file at path
is a symbolic link, the file to which it links will be used instead.
To get the status of a symbolic link file, use fs.lstat() instead.
Examples:
// Check if a directory exists
function dirExists(path, callback) {
fs.stat(path, function(err, stats) {
if(err) return callback(err);
var exists = stats.type === "DIRECTORY";
callback(null, exists);
});
};
// Get the size of a file in KB
function fileSize(path, callback) {
fs.stat(path, function(err, stats) {
if(err) return callback(err);
var kb = stats.size / 1000;
callback(null, kb);
});
}
Obtain information about the open file known by the file descriptor fd
.
Asynchronous fstat(2).
Callback gets (error, stats)
. fstat()
is identical to stat()
, except that the file to be stat-ed is
specified by the open file descriptor fd
instead of a path. See also fs.stat
Example:
fs.open("/file.txt", "r", function(err, fd) {
if(err) throw err;
fs.fstat(fd, function(err, stats) {
if(err) throw err;
// do something with stats object
// ...
fs.close(fd);
});
});
Obtain information about the file at path
(i.e., the symbolic link file itself) vs.
the destination file to which it links. Asynchronous lstat(2).
Callback gets (error, stats)
. See also fs.stat.
Example:
// Create a symbolic link, /data/logs/current to /data/logs/august
// and get info about the symbolic link file, and linked file.
fs.link("/data/logs/august", "/data/logs/current", function(err) {
if(err) throw err;
// Get status of linked file, /data/logs/august
fs.stat("/data/logs/current", function(err, stats) {
if(err) throw err;
// Size of /data/logs/august
var size = stats.size;
});
// Get status of symbolic link file itself
fs.lstat("/data/logs/current", function(err, stats) {
if(err) throw err;
// Size of /data/logs/current
var size = stats.size;
});
});
Test whether or not the given path exists by checking with the file system. Then call the callback argument with either true or false.
Example:
//Test if the file exists
fs.exists('/myfile', function (exists) {
console.log(exists ? "file exists" : "file not found");
});
fs.exists() is an anachronism and exists only for historical reasons. There should almost never be a reason to use it in your own code.
In particular, checking if a file exists before opening it is an anti-pattern that leaves you vulnerable to race conditions: another process may remove the file between the calls to fs.exists() and fs.open(). Just open the file and handle the error when it's not there.
Create a (hard) link to the file at srcPath
named dstPath
. Asynchronous link(2). Callback gets no additional arguments. Links are directory entries that point to the same file node.
Example:
fs.link('/logs/august.log', '/logs/current', function(err) {
if(err) throw err;
fs.readFile('/logs/current', 'utf8', function(err, data) {
// data is the contents of /logs/august.log
var currentLog = data;
});
});
Create a symbolic link to the file at dstPath
containing the path srcPath
. Asynchronous symlink(2). Callback gets no additional arguments.
Symbolic links are files that point to other paths.
NOTE: Filer allows for, but ignores the optional type
parameter used in node.js.
The srcPath
may be a relative path, which will be resolved relative to dstPath
Example:
// Absolute path
fs.symlink('/logs/august.log', '/logs/current', function(err) {
if(err) throw err;
fs.readFile('/logs/current', 'utf8', function(err, data) {
// data is the contents of /logs/august.log
var currentLog = data;
});
});
// Relative path
fs.symlink('../file', '/dir/symlink', function(err) {
if(err) throw err;
// The /dir/symlink file is now a symlink to /file
});
Reads the contents of a symbolic link. Asynchronous readlink(2).
Callback gets (error, linkContents)
, where linkContents
is a string
containing the symbolic link's link path. If the original srcPath
given
to symlink()
was a relative path, it will be fully resolved relative
to dstPath
when returned by readlink()
.
Example:
fs.symlink('/logs/august.log', '/logs/current', function(error) {
if(error) throw error;
fs.readlink('/logs/current', function(error, linkContents) {
// linkContents is now '/logs/august.log'
});
});
NOTE: Not implemented, see filerjs#85
Removes the directory entry located at path
. Asynchronous unlink(2).
Callback gets no additional arguments. If path
names a symbolic link, the symbolic link will be removed
(i.e., not the linked file). Otherwise, the filed named by path
will be removed (i.e., deleted).
Example:
// Delete regular file /backup.old
fs.unlink('/backup.old', function(err) {
if(err) throw err;
// /backup.old is now removed
});
Creates a node at path
based on the mode passed which is either FILE
or DIRECTORY
. Asynchronous mknod(2). Callback gets no additional arguments.
Example:
// Create a /dir directory
fs.mknod('/dir', 'DIRECTORY', function(err) {
if(err) throw err;
// /dir is now created
// Create a file inside /dir
fs.mknod('/dir/myfile', 'FILE', function(err) {
if(err) throw err;
// /dir/myfile now exists
});
});
Removes the directory at path
. Asynchronous rmdir(2).
Callback gets no additional arguments. The operation will fail if the directory at path
is not empty.
Example:
/**
* Given the following dir structure, remove docs/
* /docs
* a.txt
*/
// Start by deleting the files in docs/, then remove docs/
fs.unlink('/docs/a.txt', function(err) {
if(err) throw err;
fs.rmdir('/docs', function(err) {
if(err) throw err;
});
});
Makes a directory with name supplied in path
argument. Asynchronous mkdir(2). Callback gets no additional arguments.
NOTE: Filer allows for, but ignores the optional mode
argument used in node.js.
Example:
// Create /home and then /home/carl directories
fs.mkdir('/home', function(err) {
if(err) throw err;
fs.mkdir('/home/carl', function(err) {
if(err) throw err;
// directory /home/carl now exists
});
});
Tests a user's permissions for the file or directory supplied in path
argument. Asynchronous access(2). Callback gets no additional arguments. The mode
argument can be one of the following (constants are available on fs.constants
and fs
):
F_OK
: Test for existence of file.R_OK
: Test whether the file exists and grants read permission.W_OK
: Test whether the file exists and grants write permission.X_OK
: Test whether the file exists and grants execute permission.
NOTE: you can also create a mask consisting of the bitwise OR of two or more values (e.g. fs.constants.W_OK | fs.constants.R_OK
).
Example:
// Check if the file exists in the current directory.
fs.access(file, fs.F_OK, function(err) {
console.log(`${file} ${err ? 'does not exist' : 'exists'}`);
});
Makes a temporary directory with prefix supplied in path
argument. Method will append six random characters directly to the prefix. Asynchronous. Callback gets (error, path)
, where path is the path to the created directory.
NOTE: Filer allows for, but ignores the optional options
argument used in node.js.
Example:
// Create tmp directory with prefix foo
fs.mkdtemp("/foo-", function (error, path) {
// A new folder foo-xxxxxx will be created. Path contains a path to created folder.
});
fs.mkdtemp("/myDir/tmp", function (error, path) {
// Will create a new folder tmpxxxxxx inside myDir directory.
// Will throw error if myDir does not exist
});
Reads the contents of a directory. Asynchronous readdir(3).
Callback gets (error, files)
, where files
is an array containing the names of each directory entry (i.e., file, directory, link) in the directory, excluding .
and ..
.
Example:
/**
* Given the following dir structure:
* /docs
* a.txt
* b.txt
* c/
*/
fs.readdir('/docs', function(err, files) {
if(err) throw err;
// files now contains ['a.txt', 'b.txt', 'c']
});
Optionally accepts an options parameter, which can be either an encoding (e.g. "utf8") or an object with optional properties encoding
and withFileTypes
.
The encoding
property is a string
which will determine the character encoding to use for the names of each directory entry. The withFileTypes
property is a boolean
which defaults to false
. If true
, this method will return an array of fs.Dirent objects.
The name
property on the fs.Dirent objects will be encoded using the specified character encoding.
Closes a file descriptor. Asynchronous close(2). Callback gets no additional arguments.
Example:
fs.open('/myfile', 'w', function(err, fd) {
if(err) throw error;
// Do something with open file descriptor `fd`
// Close file descriptor when done
fs.close(fd);
});
Opens a file. Asynchronous open(2).
Callback gets (error, fd)
, where fd
is the file descriptor. The flags
argument can be:
'r'
: Open file for reading. An exception occurs if the file does not exist.'r+'
: Open file for reading and writing. An exception occurs if the file does not exist.'w'
: Open file for writing. The file is created (if it does not exist) or truncated (if it exists).'w+'
: Open file for reading and writing. The file is created (if it does not exist) or truncated (if it exists).'a'
: Open file for appending. The file is created if it does not exist.'a+'
: Open file for reading and appending. The file is created if it does not exist.
NOTE: Filer allows for, but ignores the optional mode
argument used in node.js.
Example:
fs.open('/myfile', 'w', function(err, fd) {
if(err) throw error;
// Do something with open file descriptor `fd`
// Close file descriptor when done
fs.close(fd);
});
Changes the file timestamps for the file given at path path
. Asynchronous utimes(2). Callback gets no additional arguments. Both atime
(access time) and mtime
(modified time) arguments should be a JavaScript Date or Number.
Example:
var now = Date.now();
fs.utimes('/myfile.txt', now, now, function(err) {
if(err) throw err;
// Access Time and Modified Time for /myfile.txt are now updated
});
Changes the file timestamps for the open file represented by the file descriptor fd
. Asynchronous utimes(2). Callback gets no additional arguments. Both atime
(access time) and mtime
(modified time) arguments should be a JavaScript Date or Number.
Example:
fs.open('/myfile.txt', function(err, fd) {
if(err) throw err;
var now = Date.now();
fs.futimes(fd, now, now, function(err) {
if(err) throw err;
// Access Time and Modified Time for /myfile.txt are now updated
fs.close(fd);
});
});
Changes the owner and group of a file. Asynchronous chown(2). Callback gets no additional arguments. Both uid
(user id) and gid
(group id) arguments should be a JavaScript Number. By default, 0x0
is used (i.e., root:root
ownership).
Example:
fs.chown('/myfile.txt', 500, 500, function(err) {
if(err) throw err;
// /myfile.txt is now owned by user with id 500, group 500
});
Changes the owner and group of a file. Asynchronous chown(2). Callback gets no additional arguments. Both uid
(user id) and gid
(group id) arguments should be a JavaScript Number. By default, 0x0
is used (i.e., root:root
ownership).
Example:
fs.open('/myfile.txt', function(err, fd) {
if(err) throw err;
fs.fchown(fd, 500, 500, function(err) {
if(err) throw err;
// /myfile.txt is now owned by user with id 500, group 500
fs.close(fd);
});
});
Changes the mode of a file. Asynchronous chmod(2). Callback gets no additional arguments. The mode
argument should be a JavaScript Number, which combines file type and permission information. Here are a list of common values useful for setting the mode
:
-
File type
S_IFREG=0x8000
-
Dir type
S_IFDIR=0x4000
-
Link type
S_IFLNK=0xA000
-
Permissions
755=0x1ED
-
Permissions
644=0x1A4
-
Permissions
777=0x1FF
-
Permissions
666=0x1B6
By default, directories use (0x4000 | 0x1ED)
and files use (0x8000 | 0x1A4)
.
Example:
// S_IFREG | 0o777
var mode = 0x8000 | 0x1FF
fs.chmod('/myfile.txt', mode, function(err) {
if(err) throw err;
// /myfile.txt is a regular file with permissions 777
});
Changes the mode of a file. Asynchronous chmod(2). Callback gets no additional arguments. The mode
argument should be a JavaScript Number, which combines file type and permission information. By default, 755
(dir) and 644
(file) are used.
Example:
fs.open('/myfile.txt', function(err, fd) {
if(err) throw err;
// S_IFREG | 0o777
var mode = 0x8000 | 0x1FF
fs.fchmod(fd, mode, function(err) {
if(err) throw err;
// /myfile.txt is a regular file with permissions 777
fs.close(fd);
});
});
Synchronize the data and metadata for the file referred to by fd
to disk.
Asynchronous fsync(2).
The callback gets (error)
.
fs.open('/myfile', 'r', function(error, fd) {
if(err) throw err;
// Use fd, then sync
fs.fsync(fd, function(error) {
if(err) throw err;
fs.close(fd, done);
});
});