Node.js检查存在的文件
我如何检查文件的存在?
在fs
模块的文档中有fs.exists(path, callback)
。 但据我所知,它只检查目录的存在。 我需要检查文件 !
如何才能做到这一点?
为什么不试试打开文件? fs.open('YourFile', 'a', function (err, fd) { ... })
在一分钟search后试试这个:
var path = require('path'); path.exists('foo.txt', function(exists) { if (exists) { // do something } }); // or if (path.existsSync('foo.txt')) { // do something }
对于Node.js v0.12.x和更高版本
path.exists
和fs.exists
都已被弃用
使用fs.stat:
fs.stat('foo.txt', function(err, stat) { if(err == null) { console.log('File exists'); } else if(err.code == 'ENOENT') { // file does not exist fs.writeFile('log.txt', 'Some log\n'); } else { console.log('Some other error: ', err.code); } });
一个更简单的方法来做到这一点同步。
if (fs.existsSync('/etc/file')) { console.log('Found file'); }
API文档说existsSync
如何工作:
通过检查文件系统来testing给定的path是否存在。
现在不build议使用fs.exists(path, callback)
和fs.existsSync(path)
,请参阅https://nodejs.org/api/fs.html#fs_fs_exists_path_callback和https://nodejs.org/api/fs.html# fs_fs_existssync_path 。
为了同步testing文件的存在,可以使用ie。 fs.statSync(path)
。 如果文件存在,则会返回fs.Stats
对象,请参阅https://nodejs.org/api/fs.html#fs_class_fs_stats ,否则将引发try / catch语句捕获的错误。
var fs = require('fs'), path = '/path/to/my/file', stats; try { stats = fs.statSync(path); console.log("File exists."); } catch (e) { console.log("File does not exist."); }
stat的替代方法可能是使用新的fs.access(...)
:
缩小短信function查看:
s => new Promise(r=>fs.access(s, fs.F_OK, e => r(!e)))
示例用法:
let checkFileExists = s => new Promise(r=>fs.access(s, fs.F_OK, e => r(!e))) checkFileExists("Some File Location") .then(bool => console.log(´file exists: ${bool}´))
扩大承诺方式:
// returns a promise which resolves true if file exists: function checkFileExists(filepath){ return new Promise((resolve, reject) => { fs.access(filepath, fs.F_OK, error => { resolve(!error); }); }); }
或者如果你想同步做到这一点:
function checkFileExistsSync(filepath){ let flag = true; try{ fs.accessSync(filepath, fs.F_OK); }catch(e){ flag = false; } return flag; }
V6之前的旧版本: 这里是文档
const fs = require('fs'); fs.exists('/etc/passwd', (exists) => { console.log(exists ? 'it\'s there' : 'no passwd!'); }); // or Sync if (fs.existsSync('/etc/passwd')) { console.log('it\'s there'); }
UPDATE
V6的新版本: fs.stat
文档
fs.stat('/etc/passwd', function(err, stat) { if(err == null) { //Exist } else if(err.code == 'ENOENT') { // NO exist } });
fs.exists
从1.0.0 fs.exists
已被弃用。 你可以使用fs.stat
而不是那个。
var fs = require('fs'); fs.stat(path, (err, stats) => { if ( !stats.isFile(filename) ) { // do this } else { // do this }});
这里是文档fs.stats的链接
@狐狸:很好的答案! 这里有一些扩展与更多的选项。 这是我最近一直在使用的解决scheme:
var fs = require('fs'); fs.lstat( targetPath, function (err, inodeStatus) { if (err) { // file does not exist- if (err.code === 'ENOENT' ) { console.log('No file or directory at',targetPath); return; } // miscellaneous error (eg permissions) console.error(err); return; } // Check if this is a file or directory var isDirectory = inodeStatus.isDirectory(); // Get file size // // NOTE: this won't work recursively for directories-- see: // http://stackoverflow.com/a/7550430/486547 // var sizeInBytes = inodeStatus.size; console.log( (isDirectory ? 'Folder' : 'File'), 'at',targetPath, 'is',sizeInBytes,'bytes.' ); }
PS检查fs-extra如果你还没有使用它 – 这是非常甜蜜的。 https://github.com/jprichardson/node-fs-extra )
fs.statSync(path, function(err, stat){ if(err == null) { console.log('File exists'); //code when all ok }else if (err.code == "ENOENT") { //file doesn't exist console.log('not file'); } else { console.log('Some other error: ', err.code); } });
关于fs.existsSync()
被弃用了很多不准确的评论; 不是这样。
https://nodejs.org/api/fs.html#fs_fs_existssync_path
请注意,fs.exists()已弃用,但fs.existsSync()不适用。
那么我这样做,正如在https://nodejs.org/api/fs.html#fs_fs_access_path_mode_callback
fs.access('./settings', fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK, function(err){ console.log(err ? 'no access or dir doesnt exist' : 'R/W ok'); if(err && err.code === 'ENOENT'){ fs.mkdir('settings'); } });
这有什么问题吗?
经过一番实验,我发现下面的例子使用fs.stat
是asynchronous检查文件是否存在的好方法。 它还检查你的“文件”是“真的是一个文件”(而不是一个目录)。
这个方法使用了Promises,假设你正在使用一个asynchronous代码库:
const fileExists = path => { return new Promise((resolve, reject) => { try { fs.stat(path, (error, file) => { if (!error && file.isFile()) { return resolve(true); } if (error && error.code === 'ENOENT') { return resolve(false); } }); } catch (err) { reject(err); } }); };
如果该文件不存在,承诺仍然解决,虽然是false
。 如果该文件确实存在,并且是一个目录,则parsing为true
。 任何试图读取文件的错误都会reject
承诺错误本身。
async/await
使用util.promisify
版本从节点8:
const fs = require('fs'); const { promisify } = require('util'); const stat = promisify(fs.stat); describe('async stat', () => { it('should not throw if file does exist', async () => { try { const stats = await stat(path.join('path', 'to', 'existingfile.txt')); assert.notEqual(stats, null); } catch (err) { // shouldn't happen } }); }); describe('async stat', () => { it('should throw if file does not exist', async () => { try { const stats = await stat(path.join('path', 'to', 'not', 'existingfile.txt')); } catch (err) { assert.notEqual(err, null); } }); });
在坐下的前几天,我总是检查椅子是否在那里,然后我坐在其他地方,我有一个像坐在教练那样的替代计划。 现在node.js网站build议只是去(不需要检查),答案是这样的:
fs.readFile( '/foo.txt', function( err, data ) { if(err) { if( err.code === 'ENOENT' ) { console.log( 'File Doesn\'t Exist' ); return; } if( err.code === 'EACCES' ) { console.log( 'No Permission' ); return; } console.log( 'Unknown Error' ); return; } console.log( data ); } );
代码自2014年3月起取自http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/ ,并稍作修改以适应计算机。 它也检查权限 – 删除权限来testingchmod ar foo.txt
vannilla Nodejscallback
function fileExists(path, cb){ return fs.access(path, fs.constants.F_OK,(er, result)=> cb(!err && result)) //F_OK checks if file is visible, is default does no need to be specified. }
该文档说你应该使用access()
作为替代已弃用的exists()
具有承诺内build的Nodejs(节点7+)
function fileExists(path, cb){ return new Promise((accept,deny) => fs.access(path, fs.constants.F_OK,(er, result)=> cb(!err && result)) ); }
stream行的JavaScript框架
FS-EXTRA
var fs = require('fs-extra') await fs.pathExists(filepath)
如你所见,简单得多。 而promisify的优点是,你有这个包(完整的intellisense /打字稿)完整的types! 大多数情况下,你将已经包含这个库,因为(+ -10.000)其他库依赖于它。