Spaces:
Sleeping
Sleeping
| ; | |
| const call = require('./call'); | |
| module.exports = stat; | |
| /** | |
| * Retrieves the {@link fs.Stats} for the given path. If the path is a symbolic link, | |
| * then the Stats of the symlink's target are returned instead. If the symlink is broken, | |
| * then the Stats of the symlink itself are returned. | |
| * | |
| * @param {object} fs - Synchronous or Asynchronouse facade for the "fs" module | |
| * @param {string} path - The path to return stats for | |
| * @param {function} callback | |
| */ | |
| function stat (fs, path, callback) { | |
| let isSymLink = false; | |
| call.safe(fs.lstat, path, (err, lstats) => { | |
| if (err) { | |
| // fs.lstat threw an eror | |
| return callback(err); | |
| } | |
| try { | |
| isSymLink = lstats.isSymbolicLink(); | |
| } | |
| catch (err2) { | |
| // lstats.isSymbolicLink() threw an error | |
| // (probably because fs.lstat returned an invalid result) | |
| return callback(err2); | |
| } | |
| if (isSymLink) { | |
| // Try to resolve the symlink | |
| symlinkStat(fs, path, lstats, callback); | |
| } | |
| else { | |
| // It's not a symlink, so return the stats as-is | |
| callback(null, lstats); | |
| } | |
| }); | |
| } | |
| /** | |
| * Retrieves the {@link fs.Stats} for the target of the given symlink. | |
| * If the symlink is broken, then the Stats of the symlink itself are returned. | |
| * | |
| * @param {object} fs - Synchronous or Asynchronouse facade for the "fs" module | |
| * @param {string} path - The path of the symlink to return stats for | |
| * @param {object} lstats - The stats of the symlink | |
| * @param {function} callback | |
| */ | |
| function symlinkStat (fs, path, lstats, callback) { | |
| call.safe(fs.stat, path, (err, stats) => { | |
| if (err) { | |
| // The symlink is broken, so return the stats for the link itself | |
| return callback(null, lstats); | |
| } | |
| try { | |
| // Return the stats for the resolved symlink target, | |
| // and override the `isSymbolicLink` method to indicate that it's a symlink | |
| stats.isSymbolicLink = () => true; | |
| } | |
| catch (err2) { | |
| // Setting stats.isSymbolicLink threw an error | |
| // (probably because fs.stat returned an invalid result) | |
| return callback(err2); | |
| } | |
| callback(null, stats); | |
| }); | |
| } | |