答案 0 :(得分:208)
为什么不尝试打开文件? fs.open('YourFile', 'a', function (err, fd) { ... })
无论如何,经过一分钟的搜索,试试这个:
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
*编辑:
已更改:else if(err.code == 'ENOENT')
至:else if(err.code === 'ENOENT')
Linter抱怨双重等于不等于三等于。
使用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);
}
});
答案 1 :(得分:46)
同步执行此操作的更简单方法。
if (fs.existsSync('/etc/file')) {
console.log('Found file');
}
API文档说明existsSync
如何工作:
通过检查文件系统来测试给定路径是否存在。
答案 2 :(得分:36)
stat的替代方案可能是使用新的fs.access(...)
:
缩小的短期承诺函数用于检查:
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;
}
答案 3 :(得分:11)
V6之前的旧版本: here's the documentation
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');
}
更新
V6的新版本:documentation for fs.stat
fs.stat('/etc/passwd', function(err, stat) {
if(err == null) {
//Exist
} else if(err.code == 'ENOENT') {
// NO exist
}
});
答案 4 :(得分:7)
fs.exists
已被弃用。您可以使用fs.stat
代替。{/ p>
var fs = require('fs');
fs.stat(path, (err, stats) => {
if ( !stats.isFile(filename) ) { // do this
}
else { // do this
}});
以下是文档的链接 fs.stats
答案 5 :(得分:5)
@Fox:很棒的答案! 这里有一些扩展,有更多选项。这是我最近一直在使用的解决方案:
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 (e.g. 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.'
);
}
P.S。如果你还没有使用它,请查看fs-extra--它非常可爱。 https://github.com/jprichardson/node-fs-extra)
答案 6 :(得分:5)
现代异步/等待方式(Node 12.8.x)
const fileExists = async path => !!(await fs.promises.stat(path).catch(e => false));
const main = async () => {
console.log(await fileExists('/path/myfile.txt'));
}
main();
我们需要使用fs.stat() or fs.access()
,因为fs.exists(path, callback)
现在已弃用
另一种好方法是fs-extra
答案 7 :(得分:4)
关于fs.existsSync()
被弃用,有很多不准确的评论;它不是。
https://nodejs.org/api/fs.html#fs_fs_existssync_path
请注意,不推荐使用fs.exists(),但不推荐使用fs.existsSync()。
答案 8 :(得分:3)
util.promisify
的 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);
}
});
});
版本:
.p8
答案 9 :(得分:2)
经过一些实验,我发现以下使用fs.stat
的示例是异步检查文件是否存在的好方法。它还检查您的“文件”是“真的是一个文件”(而不是目录)。
此方法使用Promises,假设您正在使用异步代码库:
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
。如果该文件存在,并且它是一个目录,则解析true
。尝试读取文件的任何错误都将reject
承诺错误本身。
答案 10 :(得分:2)
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);
}
});
答案 11 :(得分:1)
我这样做了,就像在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');
}
});
这有什么问题吗?
答案 12 :(得分:0)
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.
}
docs说您应该使用access()
代替已弃用的exists()
function fileExists(path, cb){
return new Promise((accept,deny) =>
fs.access(path, fs.constants.F_OK,(er, result)=> cb(!err && result))
);
}
var fs = require('fs-extra')
await fs.pathExists(filepath)
正如你看到的那么简单。与promisify相比的优势在于你有完整的包装版本(完整的intellisense /打字稿)!大多数情况下你已经包含了这个库,因为(+ -10.000)其他库依赖于它。
答案 13 :(得分:0)
您可以使用fs.stat
检查目标是文件还是目录,并且可以使用fs.access
检查您是否可以写/读/执行该文件。 (记得使用path.resolve
获取目标的完整路径)
文档:
完整示例(TypeScript)
import * as fs from 'fs';
import * as path from 'path';
const targetPath = path.resolve(process.argv[2]);
function statExists(checkPath): Promise<fs.Stats> {
return new Promise((resolve) => {
fs.stat(checkPath, (err, result) => {
if (err) {
return resolve(undefined);
}
return resolve(result);
});
});
}
function checkAccess(checkPath: string, mode: number = fs.constants.F_OK): Promise<boolean> {
return new Promise((resolve) => {
fs.access(checkPath, mode, (err) => {
resolve(!err);
});
});
}
(async function () {
const result = await statExists(targetPath);
const accessResult = await checkAccess(targetPath, fs.constants.F_OK);
const readResult = await checkAccess(targetPath, fs.constants.R_OK);
const writeResult = await checkAccess(targetPath, fs.constants.W_OK);
const executeResult = await checkAccess(targetPath, fs.constants.X_OK);
const allAccessResult = await checkAccess(targetPath, fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK | fs.constants.X_OK);
if (result) {
console.group('stat');
console.log('isFile: ', result.isFile());
console.log('isDir: ', result.isDirectory());
console.groupEnd();
}
else {
console.log('file/dir does not exist');
}
console.group('access');
console.log('access:', accessResult);
console.log('read access:', readResult);
console.log('write access:', writeResult);
console.log('execute access:', executeResult);
console.log('all (combined) access:', allAccessResult);
console.groupEnd();
process.exit(0);
}());
答案 14 :(得分:0)
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/获取的代码,稍加修改以适合计算机。它还会检查权限 - 删除测试chmod a-r foo.txt
答案 15 :(得分:0)
对于异步版本!并带有承诺版本!这是干净的简单方法!
try {
await fsPromise.stat(filePath);
/**
* File exists!
*/
// do something
} catch (err) {
if (err.code = 'ENOENT') {
/**
* File not found
*/
} else {
// Another error!
}
}
我的代码中有一个更实用的代码段,用于更好地说明:
try {
const filePath = path.join(FILES_DIR, fileName);
await fsPromise.stat(filePath);
/**
* File exists!
*/
const readStream = fs.createReadStream(
filePath,
{
autoClose: true,
start: 0
}
);
return {
success: true,
readStream
};
} catch (err) {
/**
* Mapped file doesn't exists
*/
if (err.code = 'ENOENT') {
return {
err: {
msg: 'Mapped file doesn\'t exists',
code: EErrorCode.MappedFileNotFound
}
};
} else {
return {
err: {
msg: 'Mapped file failed to load! File system error',
code: EErrorCode.MappedFileFileSystemError
}
};
}
}
以上示例仅用于演示!我本可以使用读取流的错误事件!赶上任何错误!跳过两个电话!
答案 16 :(得分:0)
在 node14 中使用 typescript 和 fs/promises
import * as fsp from 'fs/promises';
try{
const = await fsp.readFile(fullFileName)
...
} catch(e) { ...}
使用 fsp.readFile
比使用 fsp.stat
或 fsp.access
更好,原因有两个:
fsp.stat
和 fsp.readFile
可能会给出不同的答案。要么是由于他们提出的问题的细微差别,要么是因为文件状态在两次通话之间发生了变化。因此,编码人员必须为两个条件分支而不是一个条件分支进行编码,并且用户可能会看到更多行为。答案 17 :(得分:0)
2021 年 8 月
阅读所有帖子后:
let filePath = "./directory1/file1.txt";
if (fs.existsSync(filePath)) {
console.log("The file exists");
} else {
console.log("The file does not exist");
}