如何在 Node.js 中判断一个文件是否存在?


记录一些 Node.js 应用中的小知识点,如果你 Google/Baidu “Node.js 如何判断文件是否存在” 发现给出的很多答案还是使用的 fs.exists,这里不推荐使用 fs.exists 你可以选择 fs.stat 或 fs.access。

为什么不推荐 fs.exists

我们在设计一个回调函数时,通常会遵循一个原则 “ 错误优先的回调函数”,也就是返回值的第一个参数为错误信息,用以验证是否出错,其它的参数则用于返回数据。
如下所示为 fs.exists 的使用示例,直接返回了一个布尔值,违背了 “错误优先的回调函数” 这一设计原则,这是一方面原因。

fs.exists('/etc/passwd', (exists) => {
  console.log(exists ? '存在' : '不存在');
});

另外一个是 不推荐在 fs.open()、 fs.readFile() 或 fs.writeFile() 之前使用 fs.exists() 判断文件是否存在,因为这样会引起 竞态条件,如果是在多进程下,程序的执行不完全是线性的,当程序的一个进程在执行 fs.exists 和 fs.writeFile() 时,其它进程是有可能在这之间更改文件的状态,这样就会造成一些非预期的结果。
不推荐

(async () => {
  const exists = await util.promisify(fs.exists)('text.txt');
  console.log(exists);
  await sleep(10000);
  if (exists) {
    try {
      const res = await util.promisify(fs.readFile)('text.txt', { encoding: 'utf-8' });
      console.log(res);
    } catch (err) {
      console.error(err.code, err.message);
      throw err;
    }
  }
})();

推荐

(async () => {
  try {
    const data = await util.promisify(fs.readFile)('text.txt', { encoding: 'utf-8' });
    console.log(data);
  } catch (err) {
    if (err.code === 'ENOENT') {
      console.error('File does not exists');
    } else {
      throw err;
    }
  }
})();

目前 fs.exists 已被废弃,另外需要清楚, 只有在文件不直接使用时才去检查文件是否存在,下面推荐几个检查文件是否存在的方法。

使用 fs.stat

fs.stat 返回一个 fs.Stats 对象,该对象提供了关于文件的很多信息,例如文件大小、创建时间等。其中有两个方法 stats.isDirectory()、stats.isFile() 用来判断是否是一个目录、是否是一个文件。

const stats = await util.promisify(fs.stat)('text1.txt');
console.log(stats.isDirectory()); // false
console.log(stats.isFile()); // true

若只是检查文件是否存在,推荐使用下面的 fs.access

使用 fs.access

fs.access 接收一个 mode 参数可以判断一个文件是否存在、是否可读、是否可写,返回值为一个 err 参数。

const file = 'text.txt';

// 检查文件是否存在于当前目录中。
fs.access(file, fs.constants.F_OK, (err) => {
  console.log(`${file} ${err ? '不存在' : '存在'}`);
});

// 检查文件是否可读。
fs.access(file, fs.constants.R_OK, (err) => {
  console.log(`${file} ${err ? '不可读' : '可读'}`);
});

// 检查文件是否可写。
fs.access(file, fs.constants.W_OK, (err) => {
  console.log(`${file} ${err ? '不可写' : '可写'}`);
});

// 检查文件是否存在于当前目录中、以及是否可写。
fs.access(file, fs.constants.F_OK | fs.constants.W_OK, (err) => {
  if (err) {
    console.error(
      `${file} ${err.code === 'ENOENT' ? '不存在' : '只可读'}`);
  } else {
    console.log(`${file} 存在,且可写`);
  }
});

同样的也不推荐在 fs.open()、 fs.readFile() 或 fs.writeFile() 之前使用 fs.exists() 判断文件是否存在,会引起竞态条件。

Reference

  • http://nodejs.cn/api/fs.html

- END -

敬请关注「Nodejs技术栈」微信公众号,获取优质文章,如需投稿可在后台留言与我取得联系。

往期精彩回顾

实现浏览器中的最大请求并发数控制

跨域(CORS)产生原因分析与解决方案

Node.js 在企业中的应用实践集锦

Nodejs 中基于 Stream 的多文件合并实现

如何处理 Node.js 中出现的未捕获异常?

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用Node.js可以轻松地编写一个文件资源服务器,只需要使用Node.js的 fs 模块的 readFile 和 writeFile 方法,就可以轻松实现文件的读取和写入。下面是一个简单的示例:const fs = require('fs'); fs.readFile('file.txt', 'utf8', (err, data) => { if (err) throw err; console.log(data); }); fs.writeFile('file.txt', 'This is an example', (err) => { if (err) throw err; console.log('The file has been saved!'); }); ### 回答2: 使用Node.js编写一个文件资源服务器相对简单,可以按以下步骤进行: 1. 首先,确保已经安装了Node.js和npm包管理器。可以在终端输入以下命令来检查是否已安装: ``` node -v npm -v ``` 2. 在项目文件创建一个新的文件server.js,并在该文件导入必要的模块。可以使用以下代码: ``` const http = require('http'); const fs = require('fs'); const path = require('path'); ``` 3. 创建一个HTTP服务器并监听指定的端口。可以使用以下代码: ``` const server = http.createServer((req, res) => { // 处理请求 }); const port = 3000; // 或者你想要使用的其他端口 server.listen(port, () => { console.log(`Server running at http://localhost:${port}/`); }); ``` 4. 在请求处理函数,根据请求的URL路径获取所请求的文件路径,并使用fs模块判断文件是否存在。如果存在,则将文件内容作为响应返回给客户端。可以使用以下代码: ``` const server = http.createServer((req, res) => { const filePath = path.join(__dirname, req.url); fs.exists(filePath, (exists) => { if (exists) { fs.readFile(filePath, (err, data) => { if (err) { res.writeHead(500); res.end('Internal Server Error'); } else { res.writeHead(200); res.end(data); } }); } else { res.writeHead(404); res.end('File Not Found'); } }); }); ``` 5. 运行该服务器,打开终端,进入项目文件夹,并输入以下命令启动服务器: ``` node server.js ``` 至此,你已经成功创建了一个简单的文件资源服务器。当有请求时,服务器会查找所请求的文件,如果存在则将文件内容返回给客户端,如果不存在则返回"File Not Found"的错误信息。 ### 回答3: Node.js是基于Chrome V8引擎的JavaScript运行时环境,可以帮助我们在服务器端构建高性能的网络应用程序。使用Node.js,我们可以很方便地搭建一个文件资源服务器。 首先,我们需要创建一个新的Node.js项目并安装必要的依赖项。可以使用命令行进入项目文件夹,然后执行以下命令来初始化项目: ``` npm init ``` 按照提示进行初始化,并在项目根目录下创建一个名为 "server.js" 的文件作为服务器的主要代码文件。 接下来,我们需要使用Node.js的内置模块“http”来创建一个HTTP服务器。在 "server.js" 文件,添加以下代码: ```javascript const http = require('http'); const fs = require('fs'); const server = http.createServer((req, res) => { // 获取文件路径 const filePath = req.url; // 读取文件 fs.readFile(filePath, (err, data) => { if (err) { // 发生错误时返回404 res.writeHead(404); res.end("File not found"); return; } // 返回文件内容和Content-Type res.writeHead(200, { 'Content-Type': 'text/html' }); res.end(data); }); }); // 监听端口号 const port = 3000; server.listen(port, () => { console.log(`Server running at http://localhost:${port}/`); }); ``` 以上代码创建了一个简单的HTTP服务器,当访问服务器时,会根据URL路径读取相应的文件,并将文件内容返回给客户端。如果文件存在,则返回404错误。 为了测试服务器,我们可以将一些文件放置在与 "server.js" 文件相同的目录下,并尝试访问它们。例如,如果我们有一个名为 "index.html" 的文件,可以使用以下URL访问它:http://localhost:3000/index.html 以上就是使用Node.js编写一个文件资源服务器的基本步骤。你可以根据实际需求进行进一步的扩展和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值