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.existsfs.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)其他库依赖于它。